///////////////////////
//八皇后問題 回朔法
//該算法的思路是:每個皇后先後從第一列出發,找合適自己的列的位置。當找到合適的位置
// 則下一個皇后出發。如果沒找到則回朔到上一個皇后繼續找,知道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);
}
////////////注意考慮好各種極限位置