IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> ych——C之八皇后问题(回溯) -> 正文阅读

[数据结构与算法]ych——C之八皇后问题(回溯)

一、算法说明

八皇后问题的描述:在8*8的棋盘内使 8 个皇后棋子无冲突地摆放。在国际象棋中,皇后的移动方式为横竖交叉的,所以在一个皇后的水平、竖直以及45° 的方向上都不能出现皇后。如下图:(使用特殊符号代替皇后)
——————————————————————————————————————————————————————————————————
在这里插入图片描述

二、算法分析

1、这里使用回溯法来解决这个问题,就是确定了解空间树的组织结构后,从开始结点(即根节点)开始,以深度优先的方式对整个解空间树进行搜索。

2、要使用回溯法求解八皇后问题首先要构建一颗解空间树,通过探索这棵解空间树来得到八皇后问题的一个解或多个解。如下图:

在这里插入图片描述

3、该解空间树为第一个皇后在第一个位置的摆法的解空间树,第一个皇后还有 7 中摆法。所以八皇后可以构建 8 棵解空间树。通过探索每棵解空间树,可以探索出第一个皇后布局之后的所有解。

4、通过上图,解空间树的第一个皇后在第一个位置时的结构。可以将第一个皇后看作根节点,该结点可以派生出 8 个结点,每个结点表示了第一个皇后位置不变的情况下第二个皇后可能出现的位置。可以看出第二层中第一个结点的摆放不符合问题的要求,这里以虚线画出,于是就停止向下探索,回溯到根节点,继续接着探索下一个子结点。当第一颗解空间树全部探索完成后,继续探索第二棵解空间树。

三、初步概述

本例算法使用一个二维数组 chess[8] [8]表示棋盘布局。当数组元素为 0 时,表示该位置没有放置皇后,当数组元素为 1 时,表示该位置放置了皇后。在本算法中调用了自定义函数 isCorrect(i,n,chess)来判断棋盘中的位置chess[i][n] 是否可以放置一个皇后。该函数的设计思想是判断chess[i][n] 的所在行、列、左上方、右下方、左下方、右上方的位置的状态。

四、代码实现

#include<stdio.h>
#include<string.h>
#include<conio.h>
int count = 0;

//isCorrect 函数用于判断该位置是否可以放棋子
//返回值为 1 表示可以放置,返回 0 表示不可以放置
int isCorrect(int i, int j, int(*chess)[8]){
	int q, t;
	for(q=i, t=0; t<8; t++){
		if(chess[q][t]==1)			//判断水平方向 
			return 0;
	}
	
	for(q=0, t=j; q<8; q++){
		if(chess[q][t]==1)			//判断竖直方向 
			return 0;
	} 
	
	for(q=i-1, t=j-1; q>=0 && t>=0; q--, t--)		//判断左上方
		if(chess[q][t]==1)
			return 0;
	
	for(q=i+1, t=j+1; q<8 && t<8; q++, t++)		//判断右下方
		if(chess[q][t]==1)
			return 0;
			
	for(q=i-1, t=j+1; q>=0 && t<8; q--, t++)		//判断右上方
		if(chess[q][t]==1)
			return 0;	
			 
	for(q=i+1, t=j-1; q<8 && t>=0; q++, t--)		//判断左下方
		if(chess[q][t]==1)
			return 0;
			
	return 1;		 
} 

//eightqueen 函数实现八皇后问题的回溯法求解
//用 0-1 矩阵表示八皇后的棋盘面,0 表示未放置棋子,1 表示放置棋子了
void eightqueen(int n, int(*chess)[8]){
	int i, j;
	if(n==8){			//得到一个解 
		for(i=0; i<8; i++){			//将这个解的布局输出 
			for(j=0; j<8; j++)
				printf("%d", chess[i][j]);
			printf("\n");
		}
		printf("\n");
		count++;					//解的数量 +1 
		return;
	}
	
	for(i=0; i<8; i++){
		if(isCorrect(i, n, chess)){		//判断是否可以放置棋子 
			chess[i][n] = 1;			//放置棋子 
			eightqueen(n+1, chess);		//深度优先搜索解空间树 
			chess[i][n] = 0;
		}
	} 
} 

int main(){
	int chess[8][8], i, j;
	for(i=0; i<8; i++){					//初始化棋盘数组 
		for(j=0; j<8; j++)
			chess[i][j] = 0;
		
	}
	eightqueen(0, chess);				//执行八皇后求解函数 
	printf("The number of the answer for eightqueen is: %d", count);
	getch();
	return 0;
} 

五、结束语

1、在参考本算法时,若发现有错误或者疑问,可以提出;
2、还请各位大佬提出不足与建议,谢谢!
3、感谢各位大佬的观看,谢谢!

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 23:38:43  更:2022-04-01 23:42:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:02:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码