LeetCode51、52N皇后(回溯)Python

51. N 皇后(返回棋盘)

https://leetcode-cn.com/problems/n-queens/

皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。图为 8 皇后问题的一种解法。

给定一个整数 n,返回所有不同的 n 皇后问题的解决方案

  • 每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。
  • 皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上

https://leetcode-cn.com/problems/n-queens/solution/10xing-python-by-powcai/

class Solution(object):
    def solveNQueens(self, n):
        """
        :type n: int
        :rtype: List[List[str]]
        """
        res = []
        s = "." * n
        # 记录 行, 列, 正对角,负对角,不能有两个以上的棋子
        # 正对角就是相加之和一样的
        # 负对角就是相减只差一样的
        def back_track(i, tmp, col, z_diagonal, f_diagonal):
            if i == n:
                res.append(tmp)
                return
            for j in range(n):
                if j not in col and i + j not in z_diagonal and i - j not in f_diagonal:
                    print(z_diagonal)
                    # col | {j} 求并集
                    back_track(i + 1,
                              tmp + [s[:j] + "Q" + s[j + 1:]],
                              col | {j},
                              z_diagonal | {i + j},
                              f_diagonal | {i - j})

        back_track(0, [], set(), set(), set())
        return res
s = Solution()
print(s.solveNQueens(4))

52. N皇后 II(返回可行数)

https://leetcode-cn.com/problems/n-queens-ii/

给定一个整数 n,返回 n 皇后不同的解决方案的数量

 

class Solution(object):
    def totalNQueens(self, n):
        """
        给定一个整数 n,返回 n 皇后不同的解决方案的数量。
        """
        # 记录 行, 列, 正对角,负对角,不能有两个以上的棋子
        # 正对角就是相加之和一样的
        # 负对角就是相减只差一样的
        self.res = 0
        def back_track(i, col, z_diagonal, f_diagonal):
            if i == n:
                return True
            # col | {j} 求并集
            for j in range(n):
                if j not in col and i + j not in z_diagonal and i - j not in f_diagonal:
                    if back_track(i+1,
                                  col | {j},
                                  z_diagonal | {i + j},
                                  f_diagonal | {i - j}):
                        self.res += 1
            return False
        back_track(0, set(), set(), set())
        return self.res

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值