在一个8x8的国际象棋盘上,有8个皇后,每个皇后占一格;要求皇后间不会出现相互“相互攻击”的现象,即不能有两个皇后处在同一行,同一列或同一对角线上。问共有多少种不同的方法。
1.问题分析与算法设计
这是一个古老的具有代表性的问题,用计算机求解时的算法也很多,这里仅介绍一种。
采用一维数组来进行处理。数组的下标i表示棋盘上的第i列,a[i]的值表示皇后在第i列所放的行的位置。如:a[1]=5,表示在棋盘的第一列的第五行放一个皇后。
程序中首先假定a[1]=1,表示第一个皇后放在棋盘的第一列第一行的位置上,然后试探第二列中皇后可能的位置,找到合适的位置后,再处理后续的各列。这样通过对各列的反复试探,可以最终找出皇后的全部拜访方法。
程序采用回溯法、算法的细节请参见程序。
2.程序与程序注释
#include <stdio.h>
#define NUM 8
int a[NUM+1];
void main()
{
int number,i,k,flag,not_finish =1,count = 0;
i =1; //正在处理的元素下标,表示前i-1个元素已符合,正在处理第i个元素
a[1] = 1; //为数组的第一个元素赋初值
printf("The possible configuration of 8 queens are:\n");
while(not_finish) //not_finish =1处理尚未结束
{
while( not_finish && i<=NUM )