python 基础算法之八皇后问题

解决思路:递归/回溯

  • 首先是从数据结构的角度考虑如何记录摆放:
    既然就是棋盘,就很容易想到用二维元祖来解这个问题,但是再仔细想想,其实一维元组也是可以记录摆放方式的
    例如我用state[0] = 4 state[1] =2 表示第一行的皇后在第4列,第二行的皇后在第1列

算法思想

  • 创建一个ret=[],把所有成功的state都包进去,最后求ret
  • 关键就是state怎么求
  • 如果有八个子,我肯定每个位置都放一下,所以最外层应该是for循环
  • 放之前,我先想想这个位置能不能放,判断的函数用conflict()来表示
    -如果能放的话,我就放下来
    -看是不是最后一个子,如果不是,那么我这次的子后面的所有能放的都传给我
    -如果是最后一个子,那么我就这个结果yield回去

代码实现

def conflict(state,nextx):
    '定义冲突函数,state为元组,nextx为下一个皇后的水平位置,nexty为下一个皇后的垂直位置'
    nexty = len(state)
    for i in range(nexty):
        if abs(state[i]-nextx) in (0,nexty-i):#若下一个皇后和前面的皇后列相同或者在一条对角线上,则冲突
            return True
    return False
def queens(num=8,state=()):
    '八皇后问题,这里num表示规模'
    for pos in range(num):
        if not conflict(state,pos):#位置不冲突
            if len(state) == num - 1:#若是最后一个皇后,则返回该位置
                yield (pos,)
            else:#若不是最后一个皇后,则将该位置返回到state元组并传给后面的皇后
                for result in queens(num,state + (pos,)):
                    yield (pos,) + result
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 回溯算法 回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并...
    fredal阅读 14,672评论 0 89
  • 生活原本就像一汤苦水。只是有人能给苦中作乐。所以,对于有的人来说,生活是甜,其实本是苦;对于另外一部分人来说,生活...
    一只猫08阅读 2,860评论 0 0
  • 1:终极目的:遇见更好的自己。 2:两个小目标: a:每天早起做一件自己开心的事情,去替代自己赖床的习惯。 b:形...
    keb阅读 1,274评论 0 0
  • quick start 首先需要引用particles.js,然后创建一个空元素。 然后在js中写配置就可以了 先...
    赵晨敏阅读 4,028评论 0 0