dfs----------------hdu2553 改进版八皇后问题

终于明白前一个八皇后为什么跑那么慢了,在递归上逻辑混乱。dfs(step)求的就是第step层,可以放置皇后的位置。而我刚刚又很贱的去for(i=1;i<=step;i++)重新求了一下第1行到第step行,已经排好的棋盘的合法性。  无语,当然是合法的了。      于是,理清思路,去掉一层循环。速度就上去了。汗,原来时间复杂度是0(n*n*n),现在是0(n*n)。唉,还是基础不牢固。

AC代码:31ms

#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行皇后的位置 ,就是探索第step行的那个位置能放,都不能放就返回
{
 int i,j,k;
 int hang,lie,lxie,rxie;
 
 if(step==n+1)
 {
  count++;
  return ;
 }
     i=step;
  for(j=1;j<=n;j++)     //对每列进行探索
  {
   
   hang=0; lie=0; lxie=0; rxie=0;
   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(s[k]==j)
     lie=1;
    }
   }
   if(hang==0&&lie==0&&rxie==0&&lxie==0)  //所有条件符合
   {
    a[i][j]=1;                //则,在该位置放给一个皇后
    s[step]=j;                 //并记录
    dfs(step+1);
    s[step]=0;
    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 14:14  hrbust_09zhangyabin  阅读(472)  评论(0编辑  收藏  举报