题意:在n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于再n×n的棋盘上放置n个皇后,任何2个皇后不妨在同一行或同一列或同一斜线上。
就是考虑皇后放置的位置,对于每一行,我们需要枚举每个可以放置皇后的位置,而且需要判断当前位置(第i行)是否满足条件,即判断这个位置是否与放置好的前i-1行的皇后的位置相冲突,如果冲突,说明这个位置不合适;否则的话,就可以枚举下一行皇后的位置,直至第n行。
#include<stdio.h>
#include<string.h>
#define MAX 15
int a[MAX];
int s[MAX];
int vis[MAX];
int n,t,tot;
void dfs(int cur)
{
int i,j;
if(cur==n)
{
tot++;
}
else
{
for(i=0;i<n;i++)
{
int ok=1;
a[cur]=i;
for(j=0;j<cur;j++)
{
if(a[cur]==a[j]||cur-a[cur]==j-a[j]||cur+a[cur]==j+a[j])
{
ok=0;
break;
}
}
if(ok)
dfs(cur+1);
}
}
}
int main()
{
int m,j,i,k;
memset(a,0,sizeof(a));
memset(s,0,sizeof(s));
for(n=1;n<=10;n++)
{
tot=0;
dfs(0);
s[n]=tot;
}
while(scanf("%d",&t),t)
{
printf("%d\n",s[t]);
}
return 0;
}