题目大意
在一个 n ( 6 ≤ n ≤ 13 ) n(6≤n≤13) n(6≤n≤13) 的正方形棋盘中放 n n n 个棋子,使得每行每列每对角线都只有一个棋子。
解题思路
朴素深度优先搜索即可。可以打表。
#include <cstdio>
#include <cstdlib>
#include <cstring>
const int MAXN=15;
int n;
int a[MAXN];
int bk[MAXN]; //该数字是否被使用
int ans;
void dfs (int now){
// printf ("dfs %d\n", now);
if (now==n+1){
++ans;
if (ans<=3){
for (int i=1; i<=n; ++i)
printf ("%d ", a[i]);
puts("");
}
return;
}
for (int i=1; i<=n; ++i){
if (bk[i]) continue;
//判定对角线
int tf=0;
for (int j=1; j<now; ++j)
if (a[j]-i==j-now||a[j]-i==now-j)
tf=1;
if (tf) continue;
bk[i]=1; a[now]=i;
dfs (now+1);
bk[i]=0;
}
}
int main(){
scanf ("%d", &n);
memset (bk, 0, sizeof (bk)); ans=0;
dfs (1);
printf ("%d", ans);
}