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.."] ]
1. back tracking method
class Solution {
public:
vector<vector<string> > solveNQueens(int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
vector<vector<string> > results;
if (n<=0)
return results;
vector<string> cur;
solve(results,cur,n,0);
}
void solve(vector<vector<string> >& results,vector<string> cur,int n,int index){
if (index == n){
results.push_back(cur);
return;
}
bool * table= new bool[n];
for (int i = 0; i<n;i++)
table[i]= true;
for(int m = 0; m<index; m++)
for (int i = 0; i<n ; i++){
if (cur[m][i] == 'Q'){
table[i] = false;
if (i - (index-m) >=0)
table[i - (index-m)] =false;
if (i + (index-m) < n)
table[i + (index-m)] =false;
}
}
string temp;
for (int i = 0; i<n; i++){
temp += '.';
}
for (int i = 0; i<n ;i++){
if (table[i] == true){
temp[i] = 'Q';
cur.push_back(temp);
solve(results,cur,n,index+1);
cur.pop_back();
temp[i] = '.';
}
}
delete [] table;
}
};
2. 可以用排列组合(permutation and combination),全排列所有的情况,然后判断 i-j == Cur[i]-Cur[j] or j-i == Cur[i]-Cur[j]