///////////////////////
//八皇后问题 回朔法
//该算法的思路是:每个皇后先后从第一列出发,找合适自己的列的位置。当找到合适的位置
// 则下一个皇后出发。如果没找到则回朔到上一个皇后继续找,知道8个皇后全有合适位置为止。
#include <stdio.h>
#define MAX 8
int Match(int line[],int p) //检测是否符合条件
{
int i;
if(p==0)
return 1;
else
{
for(i=0;i<p;i++)
{
if(line[i]==line[p])
return 0;
if(p-i==line[p]-line[i])
return 0;
if(i+line[i]==p+line[p])
return 0;
}
return 1;
}
}
void main()
{
int line[MAX]={0}; //记录皇后的列座标
int p=0,k=0; //p指向当前皇后即行座标 k记录解的个数
int i;
while(1)
{
if(Match(line,p)) //符合条件
{
if(p==MAX-1) //检测是否8个皇后摆好了
{
k++;
for(i=0;i<=p;i++)
printf(" %d ",line[i]);
printf("/n");
p--;
if(line[p]==MAX-1)
p--;
line[p]++;
}
else //不到8个皇后直接下一个皇后
{
p++;
line[p]=0;
}
}
else
{
if(line[p]==MAX-1) //检测是否列座标到终点
{
if(p==0) //判断第1个皇后是否到了终点
break;
else
{
p--;
if(line[p]==MAX-1) //判断第一个皇后是否到了终点
{
if(p==0)
break;
p--;
}
line[p]++;
}
}
else //直接下一列
line[p]++;
}
}
printf("%d",k);
}
////////////注意考虑好各种极限位置