在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
1
8
5
0
1
92
10
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
int a[20];
int book[20];
int result[20];
int ans;
int n;
void dfs(int step)
{
if(step==n)
{
ans++;
return;
}
int i,k;
for(k=0;k<n;k++)///列数所有的情况进行尝试
{
if(book[k]==1)
continue;
book[k]=1;
a[step]=k;
for(i=0;i<step;i++)///行数和之前的行数和对应的列数,来判断当前填入的数和之前的数是否在一列或在45度对角线上
{
if(/*a[i]==a[step]||*/a[i]-i==a[step]-step||a[i]+i==step+a[step]){
book[k]=0;
break;
}
}
if(i==step){
dfs(step+1);///如果和前面的数没有冲突,那么进行下一行进行填数
book[k]=0;
}
}
}
int main()
{
for(n=1;n<=10;n++)///这部分就是打表,先把每个数字对应的n皇后共有多少种算出来,输出的时候就直接调用数组标。
{
memset(a,0,sizeof(a));
memset(book,0,sizeof(book));
ans=0;
dfs(0);
result[n]=ans;
}
while(~scanf("%d",&n)&&n)
{
printf("%d\n",result[n]);
}
}
’