天天看點

經典算法問題:八皇後的Python解法

#八皇後問題
board=[
    [0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0]
]

total=0;

def can_play(x,y):
    #判斷(x,y)坐标能否放皇後
    #1.判斷x行是否有皇後
    for i in range(0,y):
        if board[x][i]==1:
            return False
    #2.判斷y列是否有皇後
    for i in range(0,x):
        if board[i][y]==1:
            return False
    #3.判斷左斜是否有皇後
    for i in range(0,x):
        if x+y-i <= 7 and board[i][x+y-i]==1:
            return False
    #4.判斷右斜是否有皇後
    for index,i in enumerate(range(x-1,-1,-1)):
        s_y=y-(index+1)
        if s_y >= 0:
            if board[i][s_y]==1:
                return False
    
    return True

def print_board():
    for i in range(8):
        for j in range(8):
            if board[i][j]==0:
                print("□",end=" ")   #print()函數中加一個“空格(end=" ")”,表示不換行
            else:
                print("■",end=" ")
        print()

def put_queen(step):
    if step==8:
        print_board()
        global total
        total += 1
        print("------------------------")
    else:
        for i in range(8):
            #判斷該位置是否能放目前皇後
            if can_play(step,i):
                #1.設定現場
                board[step][i]=1
                #2.開始遞歸
                put_queen(step+1)
                #3.恢複現場   (非常重要!前面的走,後面的要恢複)
                board[step][i]=0

if __name__ == "__main__":
    print_board(0)       #從第0步開始走
    print("總共有{}種方法".format(total))   #Python的變量輸出格式:{} + format()