题目是经典的n皇后问题。即在n乘n的国际象棋棋盘上放置n个皇后,让这些皇后互相不攻击到对方。
解法:
因为一行只能放置一个皇后,所以可以按行回溯求解。在回溯过程中可以快速判断当前位置是否可行:通过3个数组b,c,d来记录每列、每条右上到坐下的斜线、每条左上到右下的斜线是否存在皇后。(更快的是通过整数存储,使用位运算来判断)
代码:
class Solution {
public:
int *a, *b, *c, *d;
vector<string> sol;
vector<vector<string>> result;
void search(int i, int n) {
if(i == n) {
result.push_back(sol);
return;
}
for(int k = 0 ; k < n ; k++) {
if(!b[k] && !c[i + k] && !d[i - k + n - 1]) {
b[k] = 1;
c[i + k] = 1;
d[i - k + n - 1] = 1;
sol[i][k] = 'Q';
search(i + 1, n);
sol[i][k] = '.';
b[k] = 0;
c[i + k] = 0;
d[i - k + n - 1] = 0;
}
}
}
vector<vector<string>> solveNQueens(int n) {
a = new int[n];
b = new int[n];
c = new int[2*n];
d = new int[2*n];
memset(a, 0, sizeof(int) * n);
memset(b, 0, sizeof(int) * n);
memset(c, 0, sizeof(int) * 2 * n);
memset(d, 0, sizeof(int) * 2 * n);
string line;
for(int j = 0 ; j < n ; j++)
line += '.';
for(int i = 0 ; i < n ; i++) {
sol.push_back(line);
}
search(0, n);
return result;
}
};