<span style="font-family:Microsoft YaHei;font-size:18px;">#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int n,ans;
int map[15];
int visit[15];
int sol[15];
int dfs(int k)
{
int i,j,flag;
if(k==n+1)// 递归结束条件
{
ans++;//做个说明,判断第一列开始,那么就是从第一列的第一行查找到第五行
return 0;
}//此种方法是按照列来存储的,所以是从1-n来存的,就是说k是标志
for(i=1;i<=n;i++)// 从第一行开始到第n行
if(!visit[i]) //判断各行是否已经有棋子
{
map[k]=i;//如果这一行没有棋子,则用map[k]=i来记录,其中i为第几行
flag=1;// k为第几列,则皇后存储在第k列,第i行
for(j=1;j<=k-1;j++) //判断是否在同一斜线上,j从第一列开始查找到第k-1列
if((map[k]-map[j])==(k-j)||(map[k]-map[j])==(j-k))//画个图验证一下
{
flag=0;
break;
}
if(flag)
{
visit[i]=1;
dfs(k+1);
visit[i]=0; //释放第i列,进行下一次搜索,此处要注意递归到结束的时候会返回的
}//一步步返回到某一步,再继续查找,这个递归只解释到这里吧
}//自己举个9*9的例子就理解为什么了,或者6*6吧
}
int main()
{
int i;
for(i=1;i<=10;i++)// 先进行打表,就是先存储,要不然会超时
{
ans=0;// 统计方法种数
n=i;// 因为第16步要用到n,自己粘贴到dev上看看
memset(map,0,sizeof(map));//初始化
memset(visit,0,sizeof(visit));
dfs(1);// 1表示从第一列开始,可以自己画一个5*5的方格
sol[i]=ans;
}
while(scanf("%d",&n),n)
printf("%d\n",sol[n]);
return 0;
}</span>
HDU-2553-N皇后问题
最新推荐文章于 2021-02-13 20:10:59 发布