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
解题思路:深搜,从第一行开始搜的第一个棋子,放n个棋子之后方法加1。
要先打个表算出1到10个棋子的放法有多少种,要不然会超时。
#include<stdio.h>
#include<string.h>
int e[20][20],num[20];
int n,sum;
int judge(int x,int y)
{
int i,j;
for(j=1;j<=n;j++) //同行
if(e[x][j]==1)
return 0;
for(i=1;i<=x;i++)//同列
if(e[i][y]==1)
return 0;
for(i=x,j=y;i>=1&&j>=1;i--,j--)//左上45度
if(e[i][j]==1)
return 0;
for(i=x,j=y;i>=1&&j<=n;i--,j++)//右上45度
if(e[i][j]==1)
return 0;
return 1;
}
void dfs(int x,int qi)
{
int j;
if(qi==n+1)
sum++;
for(j=1;j<=n;j++)
{
if(judge(x,j)==1)
{
e[x][j]=1;
dfs(x+1,qi+1);
e[x][j]=0;//回溯
}
}
}
int main()
{
int i;
memset(num,0,sizeof(num));
for(i=1;i<=10;i++)
{
memset(e,0,sizeof(e));
sum=0;
n=i;//注意这里的n
dfs(1,1);//从第一行查找第一个棋子
num[i]=sum;
//printf("%d\n",num[i]);
}
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
printf("%d\n",num[n]);
}
return 0;
}