51. N皇后

题目描述

n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
在这里插入图片描述

上图为 8 皇后问题的一种解法。

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

每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q''.' 分别代表了皇后和空位。

示例:

输入: 4
输出: [
 [".Q..",  // 解法 1
  "...Q",
  "Q...",
  "..Q."],

 ["..Q.",  // 解法 2
  "Q...",
  "...Q",
  ".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。

我的代码

class Solution:
    def solveNQueens(self, n: int) -> List[List[str]]:
        cols = [0] * n
        hill_diagonals = [0] * (2 * n - 1)
        dale_diagonals = [0] * (2 * n - 1)
        queens = set()
        res = []
        
        def backtrack(row = 0):
            for col in range(n):
                if not (cols[col] + hill_diagonals[row - col] + dale_diagonals[row + col]):
                    queens.add((row, col))
                    cols[col] = 1
                    hill_diagonals[row - col] = 1
                    dale_diagonals[row + col] = 1

                    if row + 1 == n:
                        ans = []
                        for _, col in sorted(queens):
                            ans.append('.' * col + 'Q' + '.' * (n - col - 1))
                        res.append(ans)
                    else:
                        backtrack(row + 1)

                    queens.remove((row, col))
                    cols[col] = 0
                    hill_diagonals[row - col] = 0
                    dale_diagonals[row + col] = 0

        backtrack(0)

        return res

展开阅读全文
©️2020 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值