目录

0051:N 皇后(★★)

力扣第 51 题

题目

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。

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

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

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

示例 1:

输入:n = 4
输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
解释:如上图所示,4 皇后问题存在两个不同的解法。

示例 2:

输入:n = 1
输出:[["Q"]]

提示:

  • 1 <= n <= 9

分析

典型的回溯。

解答

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
class Solution:
    def solveNQueens(self, n: int) -> List[List[str]]:
        def dfs(i):
            if i==n:
                res.append(path[:])
                return
            for j in range(n):
                if C[j]==D1[i+j]==D2[i-j]==0:
                    C[j]=D1[i+j]=D2[i-j]=1
                    path.append('.'*j+'Q'+'.'*(n-j-1))
                    dfs(i+1)
                    path.pop()
                    C[j]=D1[i+j]=D2[i-j]=0
        C,D1,D2 = [defaultdict(int) for _ in range(3)]
        res,path = [],[]
        dfs(0)
        return res

52 ms