AcWing 95. 费解的开关 Python详解

一、算法思想--递推(详细证明见算法竞赛进阶指南原书)

1)若固定第1行,则方案至多只有1种

2)把第1行的所有情况遍历,先把亮着的灯全部关闭

3)遍历前4行,如果灯是关着的,就把下1行同1列的灯改变状态

4)判断第5行是否还有关着的灯,如果有就说明无解,反之输出最少步数

二、涉及的语法知识

# 1)Python深拷贝
import copy
backup = copy.deepcopy(g)

# 2) 将不含空格的字符串输入转化成int型的数组
g = []
for i in range(5):
    g.append(list(map(int, input())))

# 3) 全局变量 global 的使用

三、完整代码

import copy # 导入copy模块,在后面会用到深拷贝
inf = float('inf')

def turn(x: int, y: int) -> None: # 开灯操作
    for i in range(5): # 控制方向
        a = x + dx[i]
        b = y + dy[i]
        if 0 <= a < 5 and 0 <= b < 5:
            g[a][b] ^= 1 # 在合法的位置,进行异或操作改变灯的状态

def solve():
    global g # 注意要把数组g设置成全局变量(之前找了好久都没发现这个错误)
    res = inf # 初始化结果为极大值
    backup = copy.deepcopy(g) # 对灯的状态深拷贝
   

你可能感兴趣的:(python)