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)

浙公网安备 33010602011771号