回溯算法的模型是 x++, not satisfy ? x-- : continue.
代码中x作列号,y[x]保存第x列上皇后放置的位置。
#include<stdio.h>
#include<math.h>
#define N 5
int position_check(int,int*);
void print_board(int count,int* y);
int main()
{
int y[N]= {}; //记录每列上的皇后放的位置
int count = ; //解的个数
int x = ;
while(x>)
{
y[x]++; //为当前x位置找一个皇后的位置
while((y[x]<=N) && !position_check(x,y))
y[x]++; //找到合适的皇后
//
if(y[x]<=N)//找到一个可以放置第x个皇后的位置,到该步为止,所求部分解都满足要求
{
if(x==N)//找到一个完整的放置方案
{
count++;
printf("%d\n",count);
for( int i=; i<=N; i ++ )
{
for( int j=; j<=N; j++ )
if( j==y[i] ) printf("x ");//如果该位置放了皇后则显示x
else printf("o ");
printf("\n");
}
}
else
x++; //继续寻找下一个皇后的位置,还没找到完整解决方案
}
else//未找到可以放置第x个皇后的位置,到该步为止,已经知道不满足要求
{
y[x] = ;//因为要回溯,下一次是寻找第x-1个皇后的位置,
//在下一次确定x-1的位置之后,第x个皇后的开始搜索的位置要重置
x--; //回溯
}
}
}
int position_check(int k,int* y) //测试合法性
{
for(int j = ; j < k; j++)
if((abs(k-j) == abs(y[j] - y[k]))||(y[j] == y[k]))
return ;
return ;
}
看了唐大仕老师的8皇后改的,基本是复制粘贴 ( ╯□╰ )