对于第一行来说,一共有1<<5种操作状态,枚举这些操作状态,得到第一行的状态,最后通过递推看最后一行能否达到都是开的状态即可。
AC代码
#我们枚举得是第一行得开关操作的种类
import copy
global msg,tmp
dx=[0,0,0,-1,1]
dy=[0,-1,1,0,0]
def turn(x,y):
for i in range(5):
a,b=x+dx[i],y+dy[i]
if 0<=a<5 and 0<=b<5:
if tmp[a][b]=="0":
tmp[a][b]="1"
else:
tmp[a][b]="0"
def work():
global tmp
ans=float("inf")
for i in range(1<<5):
res=0
tmp=copy.deepcopy(msg)
#模拟第一行所有可能的操作
for j in range(5):
if i & 1<<j:
res+=1
turn(0,j)
for j in range(4):
for k in range(5):
if tmp[j][k]=="0":
res+=1
turn(j+1,k)
ok=True
for j in range(5):
if tmp[4][j]=="0":
ok=False
break
if ok:
ans=min(ans,res)
return -1 if ans>6 else ans
n=int(input())
NUM=5
msg=[0]*NUM
tmp=[0]*NUM
while n>0:
for i in range(NUM):
msg[i]=[s for s in input()]
print(work())
if n!=1:
line=input()
n-=1