数据结构实验:八皇后问题

1、问题描述

在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上。请借鉴递归算法设计理论,设计并实现一个八皇后问题求解算法,求解并输出所有正确的解,所有输出采用棋盘式,使用*代表皇后所在位置。

2、思路流程图

图1. 算法思路流程图
图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、实验结果

在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Orange_Jet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值