基本思路
yxc:
1.使用二进制枚举,枚举出第一行灯的所有状态,共有2^5次方种可能。
2.当第一行灯的状态已经确定,那么下一行的操作也可以随之确定:假设第i行的状态已经确定,由于能影响[i,j]状态的只有紧挨它的下一行,为了让所有的灯都可以打开,如果位置[i][j]的灯是打开的,那么[i+1][j]的状态就不能切换;如果[i][j]的灯是熄灭的,那么[i+1][j]位置的状态就需要改变,才能使得第i行所有的灯都打开。
3.操作完毕后,可以保证前4行灯全都是打开的,只需要检查最后一行灯的状态。
另外要注意python读取数据会读取所有的空白字符,所以需要过滤空行。
import copy
n = int(input())
st = [] # 保存灯的状态
backup = []
step = 0
min_step = 10
def turn(x,y):
dx = [-1,1,0,0,0] # 上下左右和自己
dy = [0,0,-1,1,0]
for i in range(5):
a = x+dx[i]
b = y+dy[i]
if a > 4 or a < 0 or b > 4 or b < 0: # 越界判断
continue
else:
mapping = str.maketrans("01","10")
backup[a][b] = backup[a][b].translate(mapping)
while n:
# 输入数据
min_step = 10 # 注意这个值在每次输入数据之前都需要重新初始化
st.clear() # 注意st每次输入数据之前都需要清空 注意,python输入代码中需要过滤空行!!
# 读取 5 行灯的状态
row_count = 0
while row_count < 5:
line = input().strip()
if line: # 跳过空行
st.append(list(line))
row_count += 1 # 只有读取到有效行才计数
# 只需要枚举第一行灯的操作,此后根据上一行的状态可以确定下一行的操作
for op in range(0,32): # 使用二进制枚举,某位为1表示对该位改变其状态
step = 0 # step存储这一次找到的切换次数
backup = copy.deepcopy(st)
for i in range(0,5):
if op & (1<<i):
step += 1
turn(0,i) # 改变灯的状态
for i in range(0,4): # 根据前三行的状态决定下一行的操作
for j in range(0,5):
if backup[i][j] == '0':
step += 1
turn(i+1, j) # 如果上一行的灯是熄灭的,由于能影响该位置状态的只有紧挨它的下一行,所以下一行对应的位置必须改变状态
# 检查最后一行灯的状态是否已经全部打开
dark = False
for j in range(5):
if backup[4][j]=='0':
dark = True
break
if (not dark) and step <= 6:
min_step = min(step,min_step)
if min_step<=6:
print(min_step)
else:
print(-1)
n -= 1