19世纪著名的数学家高斯于1895年提出该N皇后的问题,主要是在nxn的国际象棋棋盘上摆放n个皇后棋子,皇后棋子之间不能互相攻击,即其中任意两个皇后都不能处于同一行、同一列或同一斜线上。要给定n然后给出所有的放置方式:
在棋盘上如何放置棋子本身就是一种试探行为,当发现不符合放置规则的时候,就需要撤回所放置的妻子是一个正常操作,因此可以想到利用回溯算法来解决这个问题,由于最终需要输出所有放置方案,所以需要借助一个列表来表示每一行中皇后的位置,将第一行中皇后放置在第1列。
在放置每个皇后时候都需要判断是否会与已经放置的之前的皇后发生冲突,为了方便复用以及解耦,可以先定义一个判断函数,传入当前的坐标位置行数和列数,然后与返回列表中已经确定的皇后来进行逐个对比判断,如果产生冲突则由判断函数来返回false,表示此位置是不可以放置皇后的,而所谓冲突,就是不能同行、同列、同对角线,同行和同列会比较容易判断,对于同对角线如何判断会稍微麻烦一些。
判断同对角线,对于两个坐标(x1,y1)、(x2,y2),当二者处于同一个对角线上的时候,x1-y1和x2-y2的绝对值是相等的,当两者处于同一个负对角线的时候,则x1+y1和x2+y2的值是相等的,因此,判断函数可根据这个来进行定义。
接下来就是考虑如何深度优先搜索和回溯,判断第i行的皇后位置的时候,对列进行遍历,判断可以将皇后放置在那一列上,找到可放置的位置之后,就更新结果列表,然后增大行数为i+1,继续递归深入,当递归深入找到不到结果的时候,就将结果列表这个时候的值退回执行之前,继续对第i行皇后放置在那一列进行遍历。
使用python实现的代码如下:
class Solution:
def NQueens(self, n):
self.re = []
self.rec = [float("inf") for i in range(n)]
self.dfs(n,0)
return self.re
def figure(self,n):
output=[]
for i in range(len(self.rec)):
stri='.'*self.rec[i]+'Q'+'.'*(n-self.rec[i]-1)
output.append(stri)
self.re.append(output)
def dfs(self, n, row):
if row == n:
self.figure(n)
for col in range(n):
if self.judge(row, col):
self.rec[row]=col
self.dfs(n, row + 1)
self.rec[row] =float("inf")
def judge(self, row, col):
for i in range(len(self.rec)):
if self.rec[i]-i==col-row or self.rec[i]+i==col+row or self.rec[i]==col:
return False
return True
以上就是“python使用回溯算法求解N皇后问题”的全部内容,希望对你有所帮助。
关于Python技术储备
学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、Python必备开发工具
三、Python视频合集
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
四、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
五、Python练习题
检查学习结果。
六、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
最后祝大家天天进步!!
上面这份完整版的Python全套学习资料已经上传至CSDN官方,朋友如果需要可以直接微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。