Leetcode-51.N皇后

题目描述

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

8-queens

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

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

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

示例:

输入: 4
输出: [
[“.Q..”, // 解法 1
“…Q”,
“Q…”,
“..Q.”],

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/n-queens
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法1:回溯

记录列,对角线,反对角线的棋子放置情况,采用回溯

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class Solution {
public:
vector<vector<string>> solveNQueens(int n) {
vector<string> pre(n,string(n,'.'));
vector<vector<string>> res;
vector<bool> col(n,false);
vector<bool> ll(2*n-1,false);
vector<bool> rr(2*n-1,false);
int row=0;
solve(n,row,col,ll,rr,pre,res);
return res;
}
void solve(int n,int row,vector<bool> &col,vector<bool> &ll,vector<bool> &rr,vector<string> &pre,vector<vector<string>> &res)
{
int j;
if(row==n)
{
res.push_back(pre);
return ;
}
int i=row;
for(j=0;j!=n;j++)
{
if(col[j]==true||ll[i+j]==true||rr[i-j+n-1]==true)
continue;

col[j]=true;
ll[i+j]=true;
rr[i-j+n-1]=true;
pre[i][j]='Q';
solve(n,row+1,col,ll,rr,pre,res);
pre[i][j]='.';

col[j]=false;
ll[i+j]=false;
rr[i-j+n-1]=false;

}
return;
}
};