Problem Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1
8
5
0
Sample Output
1
92
10
/
# include<stdio.h>
# include<math.h>
# include<string.h>
int map[11][11],num,a[11],sum,b[11];//a[i]表示第i行第a[i]列放置一个皇后
int check(int c,int l)
{
int i;
i=0;
while(i<l)
{
if(abs(c-a[i])==abs(l-i)||c==a[i])
return 0;
i++;
}
return 1;
}
void DFS(int num,int n)
{
int i;
if(num==n)
{
sum++;
return ;
}
for(i=0;i<n;i++)
{
if(check(i,num)==1)
{
a[num]=i;
DFS(num+1,n);
a[num]=0;
}
}
}
int main()
{
int i,j,n;
for(i=1;i<=10;i++)
{
sum=0;
for(j=0;j<i;j++)
{
memset(a,0,sizeof(a));
num=0; ///num表示放置皇后的位置,num+1表示已放皇后的个数,i表示要放皇后的总个数
a[num]=j;
DFS(num+1,i);
}
b[i]=sum;
}
while(scanf("%d",&n),n!=0)
printf("%d\n",b[n]);
return 0;
}
挺绕人的………………