第一种求解八皇后的方法(效率较低)
#include<cstdio>
int cnt=0; //记录满足条件的八皇后解
void dfs(int *c,int n,int cur)
{
if(cur==n)
{
++cnt;
return ;
}
for(int i=0;i<n;++i)
{
int ok=1;
c[cur]=i;
for(int j=0;j<cur;++j)
{
if(c[j]==i||cur-j==c[cur]-c[j]||cur-j==c[j]-c[cur])
{
ok=0;break;
}
}
if(ok) dfs(c,n,cur+1);
}
}
int main(void)
{
int c[8];
dfs(c,8,0);
printf("%d\n",cnt);
return 0;
}
第二种方法效率很高
利用了一个二维数组,标记当前皇后已经占领的列和两个对角线。
#include<cstdio>
#include<cstring>
int c[8];
int vis[3][16];
int cnt=0; ////记录满足条件的八皇后解
const int n=8;
void dfs(int cur)
{
if(cur==n) ++cnt;
else for(int i=0;i<n;++i)
{
if(!vis[0][i]&&!vis[1][i+cur]&&!vis[2][cur-i+n])
{
//c[cur]=i; //如果需要打印解
vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=1;
dfs(cur+1);
vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=0;
}
}
}
int main()
{
memset(vis,0,sizeof(vis));
dfs(0);
printf("%d\n",cnt);
return 0;
}
如有不当之处欢迎指出!