用了递归
def iswin(board):
win = 0
for X in board:
if(X[0]==X[1] and X[1]==X[2] and X[0]==1):
win = 1
break
if(X[0]==X[1] and X[1]==X[2] and X[0]==-1):
win = 2
break
for j in range(3):
if(board[0][j]==board[1][j] and board[0][j]==board[2][j] and board[0][j]==1):
win = 1
break
if(board[0][j]==board[1][j] and board[0][j]==board[2][j] and board[0][j]==-1):
win = 2
break
if(board[0][0]==board[1][1] and board[1][1]==board[2][2]):
if(board[0][0]==1):
win = 1
if(board[0][0]==-1):
win = 2
if(board[0][2]==board[1][1] and board[1][1]==board[2][0]):
if(board[0][2]==1):
win = 1
if(board[0][2]==-1):
win = 2
blank = 0
for X in board:
for x in X:
if(x==0):
blank+=1
if(win==1):
return blank+1
if(win==2):
return -blank-1
return 0
def dfs(next_step):
ma=-11
mi=11
if(iswin(board)!=0):
return iswin(board)
blank = 0
for X in board:
for x in X:
if(x==0):
blank+=1
if(blank==0 or blank>=8): #只下了一个子或全下满了返回0,判断是否只下了一个子可以节省大量时间
return 0
for n in range(3):
for m in range(3):
if(board[n][m]==0):
board[n][m]=next_step
if(iswin(board)!=0):
if(next_step>0):
ma = max(ma,iswin(board))
else:
mi = min(mi,iswin(board))
else:
if(next_step>0):
ma = max(ma,dfs(-next_step))
else:
mi = min(mi,dfs(-next_step))
board[n][m]=0
if(next_step>0):
return ma
else:
return mi
n = int(input())
mark=[]
for i in range(n):
board=[]
for j in range(3):
board.append(list(map(int,input().split())))
Alice = 0
Bob = 0
for a in range(3):
for b in range(3):
if(board[a][b]==1):
Alice+=1
if(board[a][b]==2):
Bob+=1
board[a][b]=-1
#判断下一布谁下
if(Alice>Bob):
next = -1
else:
next = 1
mark.append(dfs(next))
for m in mark:
print(m)