CCF CSP 棋局评估 python实现

用了递归

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)

    

    

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值