分析
每行的皇后放置都会影响其他位置的皇后,那么我们可以在每一行尝试这一行的每个位置,看能否找到合适的位置放置皇后。
模拟我们现实放置的情况,我们从第一行开始放置,尝试这第一行的每个位置,合适了就放置,然后开始放置下一行,直到放完N行。
然后再重新更换前面没有尝试过的位置,继续重复上面的操作。
定义
代码中我使用第0行表示现实中的第1行
我们使用一个名为queenPos数组的数组存放每一行皇后放置的位置
一个整型n表示N皇后的N,即有多少行
int queenPos[100]; //下标表示行数(从0开始),假定行数n最多不超过100
int n; //n皇后,表示棋盘有n行n列
当前位置是否合适的判断语句
if (queenPos[当前行以前的行] == 当前行的位置 || 绝对值(当前行 - 当前行以前的行) == 绝对值(queenPos[当前行以前的行] - 当前行的位置))
代码
#include <iostream>
#include <cmath>
using namespace std;
int queenPos[100]; //下标表示行数(从0开始),假定行数n最多不超过100
int n; //n皇后,表示棋盘有n行n列
//k表示当前在找第k行皇后的摆放位置
void Nqueen(int k) {
//因为我们这里k是从0开始的,所以当k等于n时,说明前面n行皇后被摆放好位置了
if (k == n) {
//输出摆放位置
for (int i = 0; i < n; i++)
cout << queenPos[i] + 1 << " "; //这里的+1是为了输出的行数符合人们日常的理解,从1开始到n
cout << endl;
return;
}
else {
int j;
//i代表当前第k行的第i列
for (int i = 0; i < n; i++) {
for (j = 0; j < k; j++) //j表示当前第k行的前面行数
//当前这行的第i个位置不能与前面放置的皇后放在同一列和对角线上
if (queenPos[j] == i || abs(k - j) == abs(queenPos[j] - i))
break;
//如果j等于k,那么在上面的循环里找到了合适的放置位置
if (j == k) {
queenPos[k] = i; //记录当前这行皇后放置的位置
Nqueen(k + 1); //拜访后一行的皇后
}
}
}
}
int main() {
cin >> n;
Nqueen(0);
return 0;
}