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;
}