1、问题描述
在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上。请借鉴递归算法设计理论,设计并实现一个八皇后问题求解算法,求解并输出所有正确的解,所有输出采用棋盘式,使用*代表皇后所在位置。
2、思路流程图
3、实验源码
#include<stdio.h>
#include<stdlib.h>
//全局变量数据初始化
int place[8] = { 0 }; //表示第n个皇后(第n行皇后)所占位置的列号,例如:place[1]=7 表示位置(1,7)摆放了皇后
int flag[8] = { 0 }; //表示第col列是否可占:0代表可占,1代表不可占
int diag1[15] = { 0 }; //表示主对角线是否可占,位置[i,j]的主对角线号为i-j+7
int diag2[15] = { 0 }; //表示次对角线是否可占,位置[i,j]的次对角线号为i+j
int number = 0; //用于统计结果的数量
//打印摆放结果
void show_answer()
{
int n, i, j;
int table[8][8] = { 0 };
number++;
printf("第%d组结果:\n", number);
for (n = 0; n < 8; n++)
table[n][place[n]] = 1;
for (i = 0; i < 8; i++)
{
for (j = 0; j < 8; j++)
{
if (table[i][j] == 1)
printf("* ");
else
printf("%d ", table[i][j]);
}
printf("\n");
}
}
//摆放皇后
void queen(int row)
{
int col;
for (col = 0; col < 8; col++)
{
if (flag[col] == 0 && diag1[row - col + 7] == 0 && diag2[row + col] == 0) //判断位置(i,j)是否可占
{
place[row] = col; //在第row行第col列摆放皇后
flag[col] = 1; //占领第col列
diag1[row - col + 7] = 1; //占领相应主次对角线
diag2[row + col] = 1;
if (row < 7) //8个皇后未摆放完毕
queen(row + 1);
else //8个皇后全部摆放完毕
show_answer();
//回溯继续找下一组解
flag[col] = 0;
diag1[row - col + 7] = 0;
diag2[row + col] = 0;
}
}
}
int main()
{
queen(0);
return 0;
}
4、实验结果