51.N-Queens
N-Queens Total Accepted: 27650 Total Submissions: 104979 Question Solution
The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.
Given an integer n, return all distinct solutions to the n-queens puzzle.
Each solution contains a distinct board configuration of the n-queens' placement, where 'Q'
and '.'
both indicate a queen and an empty space respectively.
For example,
There exist two distinct solutions to the 4-queens puzzle: [ [".Q..", // Solution 1 "...Q", "Q...", "..Q."], ["..Q.", // Solution 2 "Q...", "...Q", ".Q.."] ]
Show Tags Have you met this question in a real interview? Yes No
思路:回溯法=枚举+约束函数&限界函数,不属于排列树,不属于子集树。
class Solution { public:
void _backtrack(vector<vector<string>> &res,vector<int> &tem_one_res,int n,int t){
if(t>=n){
vector<string> one_res;
for(auto i:tem_one_res){
string s(n,'.');
s[i]='Q';
one_res.push_back(s);
}
res.push_back(one_res);
return;
} else{
for(int j=0;j<n;++j){
bool attack_flag=false;
for(int i=0;i<t;++i){
if(tem_one_res[i]==j || abs(tem_one_res[i]-j)==(t-i)){
attack_flag=true;
break;
}
}
if(!attack_flag){
tem_one_res.push_back(j);
_backtrack(res,tem_one_res,n,t+1);
tem_one_res.pop_back();
}
}
}
}
vector<vector<string> > solveNQueens(int n) {
vector<vector<string>> res;
if(n<1) return res;
vector<int> tem_one_res;
_backtrack(res,tem_one_res,n,0);
return res;
}
};