八皇后问题简单记录

在8*8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法?

使用回溯法

先确定好第一个皇后的位置,然后排除不可放置的位置,放置第二个皇后

继续放置皇后,若无位置可放,将皇后位置设为0,则返回上一步,若有则继续往下找寻

以下为Python代码:

def find_Queen(row):

    if row>7:
        global count
        count+=1
        print_queen()
        return
    
    for column in range(8):
        if check(row,column):
            Queen[row][column]=1
            find_Queen(row+1)
            Queen[row][column]=0

检查的代码

def check(row,column):
    
    # 检查行列
    for k in range(8):
        if Queen[k][column]==1:
            return False
        
    # 检查主对角线    
    
    for i,j in zip(range(row-1,-1,-1),range(column-1,-1,-1)):
        if Queen[i][j]==1:
            return False   
        
    # 检查副对角线     
    for i,j in zip(range(row-1,-1,-1),range(column+1,8)):
        if Queen[i][j]==1:
            return False          

    return True

具体的打印代码

def print_queen():
    
    print(Queen)
    for i in range(8):
        for j in range(8):
            if Queen[i][j]==1:
                print('☆ '*j+'★ '+'☆ '*(7-j))
    print("\n\n")
posted @ 2022-03-18 21:08  程序员Hiram  阅读(139)  评论(0)    收藏  举报