给定一个整数n,返回所有不同的解决方案到n-皇后难题。
每个解决方案都包含一个不同的板配置,即n-皇后区的位置,在那里Q和'Q'。这两个都分别表示一个女王和一个空的空间。
例如,
有两种截然不同的解决方案:4-皇后谜题:
[ [".Q..", // Solution 1 "...Q", "Q...", "..Q."], ["..Q.", // Solution 2 "Q...", "...Q", ".Q.."] ]
回溯法不断去尝试 解不唯一。
AC:
class Solution {
private:
vector<vector<string>> res;
vector<int> Try;
vector<bool> cur;
vector<bool> dis1;
vector<bool> dis2;
void println( vector<int>& vec , int n ){
vector<string> memo(n,string(n,'.'));
for( int i = 0 ; i < n ; i ++ ){
memo[i][vec[i]] = 'Q';
}
res.push_back(memo);
}
//走到了index行 Try[i] = k 表示第i行的皇后在第k列上
void findNQueenes( int n , int index , vector<int>& Try ){
if( index == n ){
println(Try,n);
return;
}
// 尝试每一行的从0到n-1列 即i的值
for( int i = 0 ; i < n ; i ++ ){
if( !cur[i] && !dis1[index-i+n-1] && !dis2[index+i] ){
//不可能出现在同一行的情况 因此只需判断同列和同斜线 利用x和y值的规律
cur[i] = dis1[index-i+n-1] = dis2[index+i] = true;
Try.push_back(i);
findNQueenes(n,index+1,Try);
//以下两句为了适应本题条件 一定要有
cur[i] = dis1[index-i+n-1] = dis2[index+i] = false;
Try.pop_back();
}
}
return;
}
public:
vector<vector<string>> solveNQueens(int n) {
if( n == 0 )
return res;
cur = vector<bool>(n,false);
dis1 = vector<bool>(2*n-1,false);
dis2 = vector<bool>(2*n-1,false);
findNQueenes( n , 0 , Try );
return res;
}
};