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