简单的DFS 回溯判断三个方向就可以了 很久很久以前谢过了 复习一下,,
AC代码
#include <bits/stdc++.h>
using namespace std;
// mps[i]=j 表示第i行到第j列有一个棋子
// vis[0] 储存棋子的列数 vis[1], vis[2] 表示 对角线上面的情况
int mps[100];
bool vis[3][100];
int sum = 0;
int n;
void dfs(int x) {
if(x > n) {
sum++;
if(sum > 3) {
return;
}
else {
for(int i = 1; i < n; i++) {
cout << mps[i] << " ";
}
cout << mps[n] << endl;
}
}
for(int i = 1; i <= n; i++) {
if((!vis[0][i]) && (!vis[1][x+i]) && (!vis[2][x-i+n])) {
mps[x] = i;
vis[0][i] = true; vis[1][x+i] = true; vis[2][x-i+n] = true;
dfs(x+1);
vis[0][i] = false; vis[1][x+i] = false; vis[2][x-i+n] = false;
}
}
}
int main() {
cin >> n;
dfs(1);
cout << sum << endl;
return 0;
}