关于对角线上元素是否满足摆放要求,由斜截式方程可知对角线方程为 y = x + b或者y = -x + b;
即:y - x = b或者y + x = b;
因此可以用两个数组来记录某一条对角线是否可摆放,为了防止数组越界,y-x应当加上合适的偏移量;
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 20;
int ans[N];//存储某种方案对应的列序列
bool col[N],diag[N * 2],udiag[N * 2];//分别表示列是否可存放,对角线是否可存放,反对角线是否可存放
int n,cnt = 0;//规模为n的棋盘,cnt表示方案数;
void dfs(int m) {//搜索第m行
if (m > n) {
cnt++;
if (cnt <= 3) {//将前三种方案输出
for (int i = 1;i <= n;i++)
cout << ans[i] << ' ';
cout << endl;
}
return;
}
for (int i = 1;i <= n;i++) {//遍历列
if (!col[i] && !diag[i + m] && !udiag[i - m + n]) {//满足摆放条件
col[i] = diag[i + m] = udiag[i - m + n] = true;
ans[m] = i;
dfs(m + 1);//搜索下一层
//回溯
col[i] = diag[i + m] = udiag[i - m + n] = false;
ans[m] = 0;
}
}
}
int main() {
cin >> n;
dfs(1);
cout << cnt << endl;
}