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

本文针对八皇后问题,通过改进递归算法,提升了程序运行效率。作者最初因在递归过程中重复验证已有布局的合法性而导致时间复杂度过高。通过简化逻辑,去除了不必要的循环,将时间复杂度从O(n*n*n)降低到了O(n*n)。

终于明白前一个八皇后为什么跑那么慢了,在递归上逻辑混乱。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;
}

转载于:https://www.cnblogs.com/zhangyabin---acm/archive/2012/03/07/2383456.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值