问题:
题目链接
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
提示:
- 皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。
示例:
输入:4
输出:[
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],
["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。
-
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
-
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
分析:
提交代码
class Solution {
vector<vector<string> > result;
void dfs(int row,int n, vector<string> &a,vector<int> LIN,vector<int> dg,vector<int> adg){
if(row == n){
result.push_back(a);
return ;
}
for(int i = 0; i < n; i++){
if(!LIN[i] && !dg[row-i + n] && !adg[row + i]){
LIN[i] = dg[row - i + n] = adg[row + i] = 1;
a[row][i] = 'Q';
dfs(row+1,n,a,LIN,dg,adg);
LIN[i] = dg[row - i + n] = adg[row + i] = 0;
a[row][i] = '.';
}
}
}
public:
vector<vector<string>> solveNQueens(int n) {
vector<int> LIN(n,0);
vector<int> dg(2*n,0);
vector<int> adg(2*n,0);
vector<string> a(n,string(n,'.'));
dfs(0,n,a,LIN,dg,adg);
return result;
}
};
完整代码
#include <iostream>
#include <vector>
#define N 10
using namespace std;
vector<vector<string> > result;
vector<int> LIN(N,0);
vector<int> dg(2*N,0);
vector<int> adg(2*N,0);
void dfs(int row,int n, vector<string> &a){
if(row == n){
result.push_back(a);
return ;
}
for(int i = 0; i < n; i++){
if(!LIN[i] && !dg[row-i + n] && !adg[row + i]){
LIN[i] = dg[row - i + n] = adg[row + i] = 1;
a[row][i] = 'Q';
dfs(row + 1, n,a);
LIN[i] = dg[row - i + n] = adg[row + i] = 0;
a[row][i] = '.';
}
}
}
int main(){
int n;
cin>>n;
vector<string> a(n,string(n,'.'));
dfs(0,n,a);
for(int i = 0; i < result.size(); i++){
cout<<"方式一"<<endl;
for(int j = 0; j < result[i].size(); j++){
cout<<result[i][j]<<endl;
}
}
}