n皇后问题

n皇后问题

是什么?

N 皇后问题源自国际象棋,所有棋子中权力最大的称为皇后,它可以直着走、横着走、斜着走(沿 45 度角),可以攻击移动途中遇到的任何棋子。N 皇后问题的具体内容是:如何将 N 个皇后摆放在 N*N 的棋盘中,使它们无法相互攻击。(即每行只能放置一个皇后,且皇后所在的列和行不能有其他的皇后。皇后所在的两条斜对线多不能放置皇后)

举个简单的例子,将 4 个皇后摆放在 4*4 的棋盘中,下图给出了一种摆放方式,各个皇后无论是直着走、横着走还是斜着走,都无法相互攻击。

                                      

 

 

                                                     图   N 皇后问题(其中Q表示为皇后)

 

解法?(利用回溯法)

 

如下图所示:

 

 

 

 

 代码如下:

#利用回溯法来求解n皇后问题
def check(arr,row,col):#用来判断皇后能否放在该第row行和第col列?
    for i in range(0,len(arr)):#遍历之前存好皇后的位置,根据之前皇后所在的位置来进行判断该第row行和第col列能否放置皇后
        if arr[i]==col or i+arr[i]==row+col or i-arr[i]==row-col:#表示为该第row行和第col列的皇后能与其他的皇后进行攻击
            return 0
        else:
            return 1
        
def dfs(arr,row,n,count):#构造dfs函数来进行求解,arr列表用来存储每一行的皇后所在列的情况(例如:arr[i]=col表示为第i行第col列);n表示为皇后的个数;count用来记录可能的个数;row表示行数
    if row==n:#当row等于n,即表示最后一个皇后放好了。一种可能表示出来
        count+=1#可能的个数加1
        return
    for i in range(0,n):#表示把第row行的每一列都放一次皇后,把每种可能都尝试一遍,找出可能的结果
        col=i
        if check(arr,row,col)==1:#判断第row行的第col列能不能放入皇后(等于1:表示为可以放皇后;等于0:表示不能放皇后)
            arr[row]=col#保存该皇后的位置(即行和列)
            dfs(arr,row+1,n,count)#搜索下一行的中皇后能放的位置
            arr[row]=0#皇后的位置还需要进行回溯,用来表示该行的下一列皇后能不能放的情况
            
n=int(input())
arr=[0]*n
count=0
dfs(arr,0,n,count)
print(count)

 总结?

(重点)该问题是搜索问题,利用了dfs算法(深搜算法)。dfs算法具有模板(即上述红色标识的代码,就是按照上述代码流程进行编写)

(重点)一定要进行回溯(回溯的内容是你设定的数组,要重新设定a[i]=0)

posted @ 2022-04-07 21:20  天空之城—我的理想国  阅读(166)  评论(0)    收藏  举报