题目描述
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 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; } };
|