由题意可知,每行有且只有一个皇后, 那么问题就变成先对第一行放一个皇后,之后再第二行中找一个位置放置皇后,一直放到最后一行,如果最后一行有位置放,那么直接answer++,否则返回到上一级,继续试下一个点。
int Nqueen(int n) {
int answer = 0;
// 按顺序从第一行开始记录皇后所在的列
vector<int> queenColunms(n, -1);
check(queenColunms, 0, n, answer);
return answer;
}
void check(vector<int>& queenColumns, int line, int& maxLine, int& answer) {
// 这一行中皇后可下的位置
vector<int> put(maxLine, 0);
// 把之前行的皇后对这一行的影响记录下来,标记为1
for(int i = 0; i < line; i++) {
int pos = queenColumns[i];
put[pos] = 1;
if ((pos - (line - i)) >= 0) {
put[pos - (line - i)] = 1;
}
if ((pos + (line - i)) < maxLine) {
put[pos + (line - i)] = 1;
}
}
// 找出剩余未被之前行皇后影响的格子,挨个放入皇后试验
for (int i = 0; i < maxLine; i++) {
if (put[i] == 0) {
if (line == maxLine - 1) {
answer ++;
return;
} else {
queenColumns[line] = i;
check(queenColumns, line + 1, maxLine, answer);
queenColumns[line] = -1;
}
}
}
}