回溯法解决N皇后问题详解[python版]

在一个N*N的表格中存在N个皇后,同时这些皇后不能处于同一行,同一列,同一对角线内,否则皇后之间会相互攻击

Q
Q
Q
Q

首先我来向大家讲解一下题目的思路:

我们假设N = 4,首先在这个4*4的表格内,我们从第一行开始加入皇后,这时候我们要考虑列了,首先我们将第一个皇后插入到第一行的第一列当中,然后开始考虑第二行,这是我们从第二行的第一列开始考虑,加入插入第一列那么就一列中存在两个皇后,显然不成立,当插入第二列时显然对角线上就有两个皇后了也不成立,当我们将第二个皇后插入第三列时就可以了,然后我们开始考虑第三行,同第二行的道理,我们将第三个皇后可以放到第二列的位置,这时候放第四个皇后我们可以发现,第一,第二,第三,第四列都不能满足皇后的独立性,这个时候我们用到回溯,我们此时回溯,回溯到第三行我们能够发现没有其余的位置可以放置第三个皇后了,再次回溯到第二行,将第二个皇后的位置移动到第四列,此时我们再考虑第三个皇后的位置,我们将其放置在第二列,当再次考虑第四个皇后时,这时后我们发现依旧无处可放,这时我们回溯到第三行没有解决方案,再次回溯到第二行也没有解决方案,这次我们回溯到第一行,将第一个皇后的位置放到第二列,同上操作,我们可以发现将第二个皇后放在第四列,第三个皇后放在第一列,第四个皇后放在第三列刚好可以满足,在这里我只是举了N = 4这个例子帮助大家更好的理解回溯和N皇后问题,当N等于其他的数字的时候也是满足这个底层逻辑的

题目思路讲完我们接下来讲讲代码实现的思路:

1:首先我们要给每一行加上一个皇后

2:我们要定义函数检查每一行加上的皇后是否合理

3:我们要定义回溯函数,当皇后的位置不合理时去回溯上一行皇后的位置并且改变

在这里我们要想到如何检查每一行加上的皇后是否合理,我们由题目可知他的每一行,每一列都只能存在一个皇后,这时我们可以遍历每一层,来根据列来给皇后找位置,而找位置的规则也就是每一行的皇后它对应列的值不能相等,其次我们知道对角线之间也不能存在着两个皇后,那么我们不难发现,假如在相邻的两行之间存在存在有两个皇后,那么他们的行数之差的绝对值必然等于列数之差的绝对值,并且等于1,假如不是相邻的两行,也会满足么他们的行数之差的绝对值必然等于列数之差的绝对值

代码实现的思路讲完了,接下来我们开始来实现代码:

def check(list,row):
#这里的i是指代的行数
for i in range(row):
#检查判断条件行数和列数之差是否相等和是否处于同一列
if list[i] == list[row] or abs(list[i] - list[row]) == abs(i - row):
return False
return True
def backtrack(list,row,n):
#当行数等于n时也就实现了一次位置的安放,这时我们可以直接返回
if row == n:
print(list)
return
#当行数不等于n时我们开始遍历行数,安置皇后
for i in range(n):
#这里的i也即皇后的列数
list[row] = i
#开始检查位置的合理性
if check(list,row):
#利用递归接着排序剩余皇后的位置
backtrack(list,row + 1,n)
n = int(input())
#初始化每一个皇后位置索引集合所对应的列表
list = [0 for i in range(n)]
#开始操作
backtrack(list,0,n)

  • 20
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值