OI-wiki 算法基础 枚举
https://oi-wiki.org/basic/enumerate/
习题答案
2811:熄灯问题 python
http://bailian.openjudge.cn/practice/2811/
import copy
# 行列数
row, col = 5, 6
original = [[0] * col for _ in range(row)]
# 获取初始状态
for i in range(row):
original[i] = list(map(int, input().split()))
# 复制初始状态
temp_original = copy.deepcopy(original)
def update_state(i, j):
original[i][j] ^= 1
directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]
for direction in directions:
ii = i + direction[0]
jj = j + direction[1]
if 0 <= ii < row and 0 <= jj < col:
original[ii][jj] ^= 1
def check(state):
for i in range(row):
if state[i][col - 1] == 1:
return False
return True
# 枚举第一列的按下的状态 0 - 2 ^ 5 - 1for k in range(2 ** 5):
res = [[0] * col for _ in range(row)]
original = copy.deepcopy(temp_original)
# 通过使用二进制转为每一个bit位的操作
state = list(map(int, bin(k)[2:]))
for i in range(5 - len(state)):
state.insert(0, 0)
# 更新第一列的状态
for i in range(row):
if state[i] == 1:
res[i][0] = 1
update_state(i, 0)
# 根据第i列哪些灯是1,决定再第i + 1列按下哪些灯,以此类推
for j in range(col - 1):
for i in range(row):
if original[i][j] == 1:
res[i][j + 1] = 1
update_state(i, j + 1)
# 最后检查最后一列是否全为0 即可
if check(original):
for i in range(row):
for j in range(col - 1):
print(res[i][j], end=' ')
print(res[i][-1])
break