dfs----------------八皇后问题

今天上午用深搜算法敲了一个N皇后,什么剪枝都没有。算法很朴素,虽然运行良好。但耗时很久!

贴别是当我看着它求解n=8时,整整用了3秒才递归出来。快笑死我了,用它来刷题,绝对废了~~~

好吧,代码先放在这里,以后好好修改它!

#include<stdio.h>
#include<string.h>

int a[105][105];    //该位置没有皇后就是0,        有皇后为1
int n;
int count;
int s[105];     //s[i]=j;   i表示第i行,j表示第i行中,第j个位置有皇后

void dfs(int step)       //探索第step行皇后的位置
{
 int i,j,k;
 int hang,lie,lxie,rxie;
 
 if(step==n+1)
 {
  for(i=1;i<=n;i++)
  {
   printf("%d ",s[i]);
  }
  printf("\n");
  count++;
 }
 for(i=step;i<=n;i++)
 {
  for(j=1;j<=n;j++)     //对每列进行探索
  {
   
   hang=0; lie=0; lxie=0; rxie=0;
   
   for(k=1;k<=n;k++)          //统计第step行中与有没有皇后
   hang+=a[step][k];
   for(k=1;k<=n;k++)        //统计第j列中有没有
   lie+=a[k][j];
   if(step>1)                //说明s[]中已经有元素了,现在检查,已有的元素s[step]与该元素是否在同一斜线
   {
    for(k=1;k<step;k++)
    {
     if((s[k]-k)==(j-i))   
     rxie=1;
     if((s[k]+k)==(i+j))
     lxie=1;
    }
   }
   if(hang==0&&lie==0&&rxie==0&&lxie==0)  //所有条件符合
   {
    a[i][j]=1;                //则,在该位置放给一个皇后
    s[step]=j;                 //并记录
    dfs(step+1);
    a[i][j]=0;
   }
  }
 }
 return ;
}
int main()
{
 while(scanf("%d",&n)!=EOF)
 {
  memset(a,0,sizeof(a));
  memset(s,0,sizeof(s));
  count=0;
  dfs(1);
  printf("%d\n",count);
 }
 return 0;
}

posted on 2012-03-07 12:12  hrbust_09zhangyabin  阅读(396)  评论(0编辑  收藏  举报