Problem description:
八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种方法可以解决此问题。
代码:
方法1:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
int n,c[1000];
void search1(int cur)
{
int i,j;
if(cur==n) {
for(int k=0;k<n;k++)
printf("%d",c[k]);
printf("\n");
return;
}
for(i=0;i<n;i++)
{
int ok=1;
c[cur]=i;
for(j=0;j<cur;j++)
if(c[cur]==c[j]||cur-c[cur]==j-c[j]||cur+c[cur]==j+c[j])
{
ok=0;break;
}
if(ok) search1(cur+1);
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
search1(0);
}
return 0;
}
方法2:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
int n,c[1000],vis[3][100];
void search1(int cur)
{
int i,j;
if(cur==n) {
for(int k=0;k<n;k++)
printf("%d",c[k]);
printf("\n");
return;
}
for(i=0;i<n;i++)
if(!vis[0][i]&&!vis[1][cur+i]&&!vis[2][cur-i+n])
{
c[cur]=i;
vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=1;
search1(cur+1);
vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=0;
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(vis,0,sizeof(vis));
search1(0);
}
return 0;
}