关于python的八皇后问题递归算法详解

这里是对于周一课上的老师教学的python八皇后问题的个人学习记录

八皇后问题出自国际象棋:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名八皇后问题。 对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2…b8,其中bi为相应摆法中第i行皇后所处的列数。已经知道8皇后问题一共有92组解(即92个不同的皇后串)

那么python怎么实现以及对于八皇后问题的求解呢?鉴于初学者水平只能讲讲递归回溯算法对于八皇后问题的求解

核心代码如下:

def isNotConfict(queen, row):   #判断是否冲突
    for i in range(0, row):
        if queen[i] == queen[row] or abs(i - row) == abs(queen[i] - queen[row]):
            return False
    return True

对于皇后间不能在同一行,以及在对角线位置,这里采用循环遍历的方式,前一个皇后与后一个皇后之间的行数不等,对角线下表元素相减绝对值也不能等判断其位置是否冲突,这里采用老师给的代码

def confict(state,nextX):
    nextY=len(state)
    for i in range(nextY):
        if abs(state[i]-nextX)in(0,nextY-i):
            return True
        return False

 

同一垂直线上abs(state[i]-nextX)==0,对角线上abs(state[i]-nextX)==nextY-i

把已知的皇后位置传给conflict函数进行判断,决定下一个皇后的位置是否会产生冲突


当只剩最后一个皇后时,只需要根据其他皇后位置自动形成他合适位置

def 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值