代码
:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int map[50][50];
int hang[50],lie[50];//hang【x】,代表x行有没有皇后,lie是相同的。
int n;
int count;
int check(int x,int y)//检查对角线有没有皇后
{
/* for(int i=0;i<n;i++)
{
if(map[i][y]==1) return 1;
if(map[x][i]==1) return 1;
}*/
int i=x,j=y;
while(i>=0&&j>=0)
{
if(map[i][j]==1) return 1;
i--,j--;
}
i=x,j=y;
while(i<n&&j<n)
{
if(map[i][j]==1) return 1;
i++,j++;
}
i=x,j=y;
while(i>=0&&j<n)
{
if(map[i][j]==1) return 1;
i--;j++;
}
i=x,j=y;
while(x<n&&y>=0)
{
if(map[i][j]==1) return 1;
x++,y--;
}
return 0;
}
void dfs(int count1,int xx)
{
if(count1==n+1)
{
count++;
return ;
}
for(int i=0;i<n;i++)
{
int x=xx;
int y=i;
//printf("a\n");
if(map[x][y]!=1)
{ if(hang[x]) continue;
if(lie[y]) continue;
if(check(x,y)) continue;
hang[x]=1;
lie[y]=1;
map[x][y]=1;
dfs(count1+1,xx+1);
hang[x]=0;
lie[y]=0;
map[x][y]=0;
}
}
}
int main()
{ int a[11]={0,1,0,0,2,10,4,40,92,352,724};
while(scanf("%d",&n)&&n)
{ printf("%d\n",a[n]);
/*count=0;
memset(map,0,sizeof(map));
memset(hang,0,sizeof(hang));
memset(lie,0,sizeof(lie));
dfs(1,0);
printf("%d\n",count);*/
}
}