八皇后问题
核心思想:回溯
在此问题中,先在第一列找到相应的合法放置位置后,开始在第二列挨个放置皇后,判断其位置是否合法,若合法则继续放置下一列,不合法则退回到上一列,在上一列找到第二个合法位置后继续,前进至下一列,如此继续,直至全部八列都放入合法位置为止。自己可以根据四皇后来推导下看看。
程序如下所示
#include
int p[8] = {0}; //数组中的数字表示在哪个位置放置皇后
int abs(int i) //绝对值函数
{
if(i >= 0)
return i;
else
return -i;
}
int place(int x) //判断放置位置是否合法
{
int i;
for(i = 0 ; i < x ; ++i)
{
if(abs(x - i) == abs(p[x] - p[i]) || p[x] == p[i])
return 0;
}
return 1;
}
int main()
{
int i = 0;
int j = 0;
int count=0;
while(!(i == 0 && p[i] > 7)) //此限制条件是为了输出全部结果(即回溯到p[0]的值大于7)
{
while(place(i) == 0) //找到合法放置位置
p[i]++;
if(p[i] > 7) //p[i]的值若大于7,则说明该列放置失败,回到上一列,将上一列加1继续
{
p[i] = 0;
i--;
p[i]++;
}
else
++i; //否则说明成功放置,继续下一列
if(i > 7) //找到成功的放置方式,输出结果
{
for(j = 0 ; j < 8 ; ++j)
printf("%3d",p[j]);
printf("\n");
count++;
p[i]++; //输出结果后,继续寻找下一放置方式
}
}
printf("%d\n",count);
return 1;
}
总计92种输出,结果就不放了编译运行下。