Python N皇后算法

递归法

  • 用一个一维N元数组来存放每一行皇后的位置,这样就不存在行冲突了,只要判断哪一列可以放置就可以了,如果找到一个可以放置皇后的位置j后,则会递归探测下一行,结束后则会继续探测i行j+1列,故可以找到所有的N皇后的解。
class Solution:
    #最后mark数组里面标记的是皇后的位置,例如mark[0] = 2, 表示第一行皇后放在第3列的位置
    def make(self, mark):
        #初始化数组
        r = [['.' for _ in range(len(mark))] for _ in range(len(mark))]
        #将每一行中皇后的位置用‘Q’代替
        for i in mark:
            r[i][mark[i]] = 'Q'
        #枚举,将原来散的元素连接成字符串
        for k, v in enumerate(r):
            r[k] = ''.join(v)
        return r

    #递归函数,核心
    def recursive(self, mark, cur, ret):

        #如果当前行是最后一行,记录一个解,并返回上一级调用,继续探测
        if cur == len(mark):
            ret.append(self.make(mark))
            return

        #试探处理,将当前行的皇后应该在的位置遍历每一列,如果满足条件,递归调用处理下一行
        for i in range(len(mark)):
            mark[cur], down = i, True
            for j in range(cur):
                if mark[j] == i or abs(i-mark[j]) == cur - j:
                    down = False
                    break
            if down:
                self.recursive(mark, cur+1, ret)

    def solveNQueens(self, n):

        ret = []
        self.recursive([None]*n, 0, ret)
        return ret

enity = Solution()
print enity.solveNQueens(4)
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 回溯算法 回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并...
    fredal阅读 14,701评论 0 89
  • 问题描述 n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击(不同行,不同列,不同对角线)。给定...
    Alfie20阅读 3,746评论 0 0
  • 这一天,所有的老鼠为它而疯狂…… 下水道是城市的良心。这是长老跟我说的,但我并不能懂他这话是什么意思,长老也不期待...
    空瑾阅读 2,600评论 0 0
  • 秋宵月色胜春宵,万里霜天静寂寥。 2016年8月,中国旗袍会烟台联合总会应邀烟台电视台外景拍摄,来到了美丽...
    渔知鱼阅读 4,212评论 0 1
  • 它们之间的主要区别在于Docker是一个在你的本机操作系统中运行的独立进程,而虚拟机是一个完整的隔离操作系统,它在...
    那个_夏天阅读 3,596评论 0 0

友情链接更多精彩内容