求教C语言回溯法写出八皇后问题的92种解

(1)全排列

将自然数1~n进行排列,***形成n!中排列方式,叫做全排列。

例如3的全排列是:1/2/3、1/3/2、2/1/3、2/3/1、3/1/2、3/2/1,***3!=6种。

(2)8皇后(或者n皇后)

保证8个皇后不能互相攻击,即保证每一横行、每一竖行、每一斜行最多一个皇后。

我们撇开第三个条件,如果每一横行、每一竖行都只有一个皇后。

将8*8棋盘标上坐标。我们讨论其中的一种解法:

- - - - - - - Q

- - - Q - - - -

Q - - - - - - -

- - Q - - - - -

- - - - - Q - -

- Q - - - - - -

- - - - - - Q -

- - - - Q - - -

如果用坐标表示就是:(1,8) (2,4) (3,1) (4,3) (5,6) (6,2) (7,7) (8,5)

将横坐标按次序排列,纵坐标就是8/4/1/3/6/2/7/5。这就是1~8的一个全排列。

我们将1~8的全排列存入输入a[]中(a[0]~a[7]),然后8个皇后的坐标就是(i+1,a[i]),其中i为0~7。

这样就能保证任意两个不会同一行、同一列了。

置于斜行,你知道的,两个点之间连线的斜率绝对值为1或者-1即为同一斜行,充要条件是|x1-x2|=|y1-y2|(两个点的坐标为(x1,y1)(x2,y2))。我们在输出的时候进行判断,任意两个点如果满足上述等式,则判为失败,不输出。

下面附上代码:添加必要的注释,其中全排列的实现看看注释应该可以看懂:

#include<stdio.h>

#include<math.h>

#include<string.h>

#include<stdlib.h>

int?printed;

//该函数用于画图,这里为了节约空间则略去

//读者只需要将draw(a,k);去掉注释即可画图

void?draw(int*?a,int?k)

{

int?i,j;

for(i=0;i<k;i++)

{

printf("\t");

for(j=0;j<k;j++)

//有皇后输出Q,否则输出-

if(a[i]-1==j)?printf("Q?");?else?printf("-?");

printf("\n");

}

printf("\n");

}

//递归实现全排列,a是数组,iStep是位置的测试点,k是皇后的个数,一般等于8

void?Settle(int?*a,int?iStep,int?k)

{

int?i,j,l,flag=1;

//如果iStep的数字等于a之前的数字,则存在重复,返回

for(i=0;i<iStep-1;i++)

if(a[iStep-1]==a[i])?return;

//如果iStep==k,即递归结束到最后一位,可以验证是否斜行满足

if(iStep==k)?

{

//双重循环判断是否斜行满足

for(j=0;j<k;j++)

for(l=0;l<k&&l!=j;l++)

//如果不满足,则flag=0

if(fabs(j-l)==fabs(a[j]-a[l]))?flag=0;

//如果flag==1,则通过了斜行的所有测试,输出。

if(flag)

{

for(i=0;i<k;i++)

printf("(%d,%d)?",i+1,a[i]);

printf("\n");

//如果去掉这里的注释可以获得画图,由于空间不够,这里略去

// draw(a,k);

//printed变量计算有多少满足题意的结果,是全局变量

printed++;

}

flag=1;

}

//如果未测试至最后末尾,则测试下一位(递归)

for(i=1;i<=k;i++)

{

a[iStep]=i;

Settle(a,iStep+1,k);

}

}

void?main()

{

int*?a;

int?k;

//输入维数,建立数组

printf("Enter?the?size?of?the?square:");

scanf("%d",&k);

a=(int*)calloc(k,sizeof(int));

//清屏,从iStep=0处进入递归

system("cls");

Settle(a,0,k);

//判断最后是否有结果

if(!?printed)?printf("No?answers?accepted!\n");

else?printf("%d?states?available!\n",printed);

}

附输出结果(输入k=8):

(1,1)?(2,5)?(3,8)?(4,6)?(5,3)?(6,7)?(7,2)?(8,4)

(1,1)?(2,6)?(3,8)?(4,3)?(5,7)?(6,4)?(7,2)?(8,5)

(1,1)?(2,7)?(3,4)?(4,6)?(5,8)?(6,2)?(7,5)?(8,3)

(1,1)?(2,7)?(3,5)?(4,8)?(5,2)?(6,4)?(7,6)?(8,3)

(1,2)?(2,4)?(3,6)?(4,8)?(5,3)?(6,1)?(7,7)?(8,5)

(1,2)?(2,5)?(3,7)?(4,1)?(5,3)?(6,8)?(7,6)?(8,4)

(1,2)?(2,5)?(3,7)?(4,4)?(5,1)?(6,8)?(7,6)?(8,3)

(1,2)?(2,6)?(3,1)?(4,7)?(5,4)?(6,8)?(7,3)?(8,5)

(1,2)?(2,6)?(3,8)?(4,3)?(5,1)?(6,4)?(7,7)?(8,5)

(1,2)?(2,7)?(3,3)?(4,6)?(5,8)?(6,5)?(7,1)?(8,4)

(1,2)?(2,7)?(3,5)?(4,8)?(5,1)?(6,4)?(7,6)?(8,3)

(1,2)?(2,8)?(3,6)?(4,1)?(5,3)?(6,5)?(7,7)?(8,4)

(1,3)?(2,1)?(3,7)?(4,5)?(5,8)?(6,2)?(7,4)?(8,6)

(1,3)?(2,5)?(3,2)?(4,8)?(5,1)?(6,7)?(7,4)?(8,6)

(1,3)?(2,5)?(3,2)?(4,8)?(5,6)?(6,4)?(7,7)?(8,1)

(1,3)?(2,5)?(3,7)?(4,1)?(5,4)?(6,2)?(7,8)?(8,6)

(1,3)?(2,5)?(3,8)?(4,4)?(5,1)?(6,7)?(7,2)?(8,6)

(1,3)?(2,6)?(3,2)?(4,5)?(5,8)?(6,1)?(7,7)?(8,4)

(1,3)?(2,6)?(3,2)?(4,7)?(5,1)?(6,4)?(7,8)?(8,5)

(1,3)?(2,6)?(3,2)?(4,7)?(5,5)?(6,1)?(7,8)?(8,4)

(1,3)?(2,6)?(3,4)?(4,1)?(5,8)?(6,5)?(7,7)?(8,2)

(1,3)?(2,6)?(3,4)?(4,2)?(5,8)?(6,5)?(7,7)?(8,1)

(1,3)?(2,6)?(3,8)?(4,1)?(5,4)?(6,7)?(7,5)?(8,2)

(1,3)?(2,6)?(3,8)?(4,1)?(5,5)?(6,7)?(7,2)?(8,4)

(1,3)?(2,6)?(3,8)?(4,2)?(5,4)?(6,1)?(7,7)?(8,5)

(1,3)?(2,7)?(3,2)?(4,8)?(5,5)?(6,1)?(7,4)?(8,6)

(1,3)?(2,7)?(3,2)?(4,8)?(5,6)?(6,4)?(7,1)?(8,5)

(1,3)?(2,8)?(3,4)?(4,7)?(5,1)?(6,6)?(7,2)?(8,5)

(1,4)?(2,1)?(3,5)?(4,8)?(5,2)?(6,7)?(7,3)?(8,6)

(1,4)?(2,1)?(3,5)?(4,8)?(5,6)?(6,3)?(7,7)?(8,2)

(1,4)?(2,2)?(3,5)?(4,8)?(5,6)?(6,1)?(7,3)?(8,7)

(1,4)?(2,2)?(3,7)?(4,3)?(5,6)?(6,8)?(7,1)?(8,5)

(1,4)?(2,2)?(3,7)?(4,3)?(5,6)?(6,8)?(7,5)?(8,1)

(1,4)?(2,2)?(3,7)?(4,5)?(5,1)?(6,8)?(7,6)?(8,3)

(1,4)?(2,2)?(3,8)?(4,5)?(5,7)?(6,1)?(7,3)?(8,6)

(1,4)?(2,2)?(3,8)?(4,6)?(5,1)?(6,3)?(7,5)?(8,7)

(1,4)?(2,6)?(3,1)?(4,5)?(5,2)?(6,8)?(7,3)?(8,7)

(1,4)?(2,6)?(3,8)?(4,2)?(5,7)?(6,1)?(7,3)?(8,5)

(1,4)?(2,6)?(3,8)?(4,3)?(5,1)?(6,7)?(7,5)?(8,2)

(1,4)?(2,7)?(3,1)?(4,8)?(5,5)?(6,2)?(7,6)?(8,3)

(1,4)?(2,7)?(3,3)?(4,8)?(5,2)?(6,5)?(7,1)?(8,6)

(1,4)?(2,7)?(3,5)?(4,2)?(5,6)?(6,1)?(7,3)?(8,8)

(1,4)?(2,7)?(3,5)?(4,3)?(5,1)?(6,6)?(7,8)?(8,2)

(1,4)?(2,8)?(3,1)?(4,3)?(5,6)?(6,2)?(7,7)?(8,5)

(1,4)?(2,8)?(3,1)?(4,5)?(5,7)?(6,2)?(7,6)?(8,3)

(1,4)?(2,8)?(3,5)?(4,3)?(5,1)?(6,7)?(7,2)?(8,6)

(1,5)?(2,1)?(3,4)?(4,6)?(5,8)?(6,2)?(7,7)?(8,3)

(1,5)?(2,1)?(3,8)?(4,4)?(5,2)?(6,7)?(7,3)?(8,6)

(1,5)?(2,1)?(3,8)?(4,6)?(5,3)?(6,7)?(7,2)?(8,4)

(1,5)?(2,2)?(3,4)?(4,6)?(5,8)?(6,3)?(7,1)?(8,7)

(1,5)?(2,2)?(3,4)?(4,7)?(5,3)?(6,8)?(7,6)?(8,1)

(1,5)?(2,2)?(3,6)?(4,1)?(5,7)?(6,4)?(7,8)?(8,3)

(1,5)?(2,2)?(3,8)?(4,1)?(5,4)?(6,7)?(7,3)?(8,6)

(1,5)?(2,3)?(3,1)?(4,6)?(5,8)?(6,2)?(7,4)?(8,7)

(1,5)?(2,3)?(3,1)?(4,7)?(5,2)?(6,8)?(7,6)?(8,4)

(1,5)?(2,3)?(3,8)?(4,4)?(5,7)?(6,1)?(7,6)?(8,2)

(1,5)?(2,7)?(3,1)?(4,3)?(5,8)?(6,6)?(7,4)?(8,2)

(1,5)?(2,7)?(3,1)?(4,4)?(5,2)?(6,8)?(7,6)?(8,3)

(1,5)?(2,7)?(3,2)?(4,4)?(5,8)?(6,1)?(7,3)?(8,6)

(1,5)?(2,7)?(3,2)?(4,6)?(5,3)?(6,1)?(7,4)?(8,8)

(1,5)?(2,7)?(3,2)?(4,6)?(5,3)?(6,1)?(7,8)?(8,4)

(1,5)?(2,7)?(3,4)?(4,1)?(5,3)?(6,8)?(7,6)?(8,2)

(1,5)?(2,8)?(3,4)?(4,1)?(5,3)?(6,6)?(7,2)?(8,7)

(1,5)?(2,8)?(3,4)?(4,1)?(5,7)?(6,2)?(7,6)?(8,3)

(1,6)?(2,1)?(3,5)?(4,2)?(5,8)?(6,3)?(7,7)?(8,4)

(1,6)?(2,2)?(3,7)?(4,1)?(5,3)?(6,5)?(7,8)?(8,4)

(1,6)?(2,2)?(3,7)?(4,1)?(5,4)?(6,8)?(7,5)?(8,3)

(1,6)?(2,3)?(3,1)?(4,7)?(5,5)?(6,8)?(7,2)?(8,4)

(1,6)?(2,3)?(3,1)?(4,8)?(5,4)?(6,2)?(7,7)?(8,5)

(1,6)?(2,3)?(3,1)?(4,8)?(5,5)?(6,2)?(7,4)?(8,7)

(1,6)?(2,3)?(3,5)?(4,7)?(5,1)?(6,4)?(7,2)?(8,8)

(1,6)?(2,3)?(3,5)?(4,8)?(5,1)?(6,4)?(7,2)?(8,7)

(1,6)?(2,3)?(3,7)?(4,2)?(5,4)?(6,8)?(7,1)?(8,5)

(1,6)?(2,3)?(3,7)?(4,2)?(5,8)?(6,5)?(7,1)?(8,4)

(1,6)?(2,3)?(3,7)?(4,4)?(5,1)?(6,8)?(7,2)?(8,5)

(1,6)?(2,4)?(3,1)?(4,5)?(5,8)?(6,2)?(7,7)?(8,3)

(1,6)?(2,4)?(3,2)?(4,8)?(5,5)?(6,7)?(7,1)?(8,3)

(1,6)?(2,4)?(3,7)?(4,1)?(5,3)?(6,5)?(7,2)?(8,8)

(1,6)?(2,4)?(3,7)?(4,1)?(5,8)?(6,2)?(7,5)?(8,3)

(1,6)?(2,8)?(3,2)?(4,4)?(5,1)?(6,7)?(7,5)?(8,3)

(1,7)?(2,1)?(3,3)?(4,8)?(5,6)?(6,4)?(7,2)?(8,5)

(1,7)?(2,2)?(3,4)?(4,1)?(5,8)?(6,5)?(7,3)?(8,6)

(1,7)?(2,2)?(3,6)?(4,3)?(5,1)?(6,4)?(7,8)?(8,5)

(1,7)?(2,3)?(3,1)?(4,6)?(5,8)?(6,5)?(7,2)?(8,4)

(1,7)?(2,3)?(3,8)?(4,2)?(5,5)?(6,1)?(7,6)?(8,4)

(1,7)?(2,4)?(3,2)?(4,5)?(5,8)?(6,1)?(7,3)?(8,6)

(1,7)?(2,4)?(3,2)?(4,8)?(5,6)?(6,1)?(7,3)?(8,5)

(1,7)?(2,5)?(3,3)?(4,1)?(5,6)?(6,8)?(7,2)?(8,4)

(1,8)?(2,2)?(3,4)?(4,1)?(5,7)?(6,5)?(7,3)?(8,6)

(1,8)?(2,2)?(3,5)?(4,3)?(5,1)?(6,7)?(7,4)?(8,6)

(1,8)?(2,3)?(3,1)?(4,6)?(5,2)?(6,5)?(7,7)?(8,4)

(1,8)?(2,4)?(3,1)?(4,3)?(5,6)?(6,2)?(7,7)?(8,5)

92?states?available!