博客
关于我
AcWing 95. 费解的开关 二进制全排列+思维
阅读量:578 次
发布时间:2019-03-09

本文共 2209 字,大约阅读时间需要 7 分钟。

为了解决这个问题,我们需要判断在6步以内是否可以使5x5的灯阵中的所有灯都亮起。每个灯的状态可以通过翻动其开关来改变,并且翻动一个灯会导致其相邻的灯也跟着改变状态。

方法思路

我们可以通过枚举所有可能的初始状态来解决这个问题。具体来说,我们将第一行的灯状态固定下来,共有32种可能的组合。对于每一种组合,我们会模拟翻动灯的过程,计算所需的步骤数,并检查是否在6步以内完成任务。

具体步骤如下:

  • 读取输入,包括n个测试用例。
  • 对于每个测试用例,枚举所有可能的第一行状态(32种)。
  • 对于每种状态,复制初始状态到当前状态数组。
  • 模拟翻动灯的过程,计算所需的步骤数。
  • 检查是否在6步以内完成任务,并记录最小的步骤数。
  • 如果所有情况都遍历过了,找到最小的步骤数,否则返回-1。
  • 解决代码

    import sysdef main():    input = sys.stdin.read().split()    idx = 0    n = int(input[idx])    idx += 1    for _ in range(n):        rows = []        while len(rows) < 5:            rows.append(input[idx])            idx += 1        grid = [list(row) for row in rows]        found = -1        for mask in range(32):            current = [list(row) for row in grid]            cnt = 0            for j in range(5):                if (mask >> j) & 1:                    x, y = 0, j                    for dx, dy in [(0,1),(1,0),(0,-1),(-1,0)]:                        if 0 <= x+dx <5 and 0 <= y+dy <5:                            current[x+dx][y+dy] = '1' if current[x+dx][y+dy] == '0' else '0'                    cnt += 1            for i in range(4):                for j in range(5):                    if current[i][j] == '0':                        x, y = i+1, j                        for dx, dy in [(0,1),(1,0),(0,-1),(-1,0)]:                            if 0 <= x+dx <5 and 0 <= y+dy <5:                                current[x+dx][y+dy] = '1' if current[x+dx][y+dy] == '0' else '0'                        cnt += 1                        if cnt >= 6:                            break                if cnt >=6:                    break            all_on = True            for j in range(5):                if current[4][j] != '1':                    all_on = False                    break            if all_on and cnt <=6:                if found == -1 or cnt < found:                    found = cnt            if found <=6:                break        print(found if found != -1 else -1)if __name__ == '__main__':    main()

    代码解释

  • 读取输入:从标准输入读取数据,包括n个测试用例。
  • 枚举第一行状态:对于每个测试用例,枚举所有可能的第一行状态(0到31)。
  • 模拟翻动过程:对于每种第一行状态,复制初始状态到当前状态数组,然后模拟翻动灯的过程,计算所需的步骤数。
  • 检查是否完成任务:检查当前状态是否所有灯都亮起,并且步骤数是否在6步以内。如果是,记录最小的步骤数。
  • 输出结果:对于每个测试用例,输出最少需要的步骤数,或者-1表示无法在6步内完成任务。
  • 通过这种方法,我们可以高效地解决问题,并找到最优解。

    转载地址:http://phkpz.baihongyu.com/

    你可能感兴趣的文章
    org/hibernate/validator/internal/engine
    查看>>
    SQL-36 创建一个actor_name表,将actor表中的所有first_name以及last_name导入改表。
    查看>>
    orm总结
    查看>>
    os.system 在 Python 中不起作用
    查看>>
    OSCACHE介绍
    查看>>
    SQL--合计函数(Aggregate functions):avg,count,first,last,max,min,sum
    查看>>
    OSChina 周四乱弹 ——程序员为啥要买苹果手机啊?
    查看>>
    OSError: no library called “cairo-2“ was foundno library called “cairo“ was foundno library called
    查看>>
    OSG学习:几何体的操作(二)——交互事件、Delaunay三角网绘制
    查看>>
    OSG学习:几何对象的绘制(三)——几何元素的存储和几何体的绘制方法
    查看>>
    OSG学习:几何对象的绘制(二)——简易房屋
    查看>>
    OSG学习:场景图形管理(一)——视图与相机
    查看>>
    OSG学习:场景图形管理(三)——多视图相机渲染
    查看>>
    OSG学习:场景图形管理(四)——多视图多窗口渲染
    查看>>
    OSG学习:新建C++/CLI工程并读取模型(C++/CLI)——根据OSG官方示例代码初步理解其方法
    查看>>
    Sql 随机更新一条数据返回更新数据的ID编号
    查看>>
    OSG学习:空间变换节点和开关节点示例
    查看>>
    OSG学习:纹理映射(一)——多重纹理映射
    查看>>
    OSG学习:纹理映射(七)——聚光灯
    查看>>
    OSG学习:纹理映射(三)——立方图纹理映射
    查看>>