堆栈与队列算法-八皇后问题的求解算法

news2024/11/18 20:35:56

目录

堆栈与队列算法-八皇后问题的求解算法

C++代码


堆栈与队列算法-八皇后问题的求解算法

八皇后问题是一种常见的堆栈应用实例。在国际象棋中的皇后可以在没有限定一步走几格的前提下,对棋盘中的其他棋子直吃、横吃和对角斜吃(左斜吃或右斜吃均可)。现在要放入多个皇后到棋盘上,相互之间不能互相吃到对方。后放入的新皇后,放入前必须考虑所放位置的直线方向、横线方向或对角线方向是否已被放置了旧皇后,否则就会被先放入的旧皇后吃掉。

利用这种概念,我们将其应用到4X4的棋盘上,就称为四皇后问题;应用在8X8的棋盘上,就称为八皇后问题;应用在NXN的棋盘上,就称为N皇后问题。要解决N皇后问题(在此我们以八皇后为例),首先在棋盘中放入一个新皇后,且不会被先前放置的旧皇后吃掉,然后这个新皇后的位置压入堆栈。

如果放置新皇后的该行(或该列)的8个位置都没有办法放置新皇后(放入任何一个位置都会被先前放置的旧皇后吃掉),就必须从堆栈中弹出前一个皇后的位置,并在该行(或该列)中重新寻找一个新的位置,再将该位置压入堆栈中,这种方式就是一种回溯算法的应用。

N皇后问题的解答就是结合堆栈和回溯两种数据结构,以逐行(或逐列)寻找新皇后合适的位置(如果找不到,就回溯到前一行寻找前一个皇后的另一个新位置,依此类推)的方式来寻找N皇后问题的其中一组解答。

C++代码

#include<iostream>
using namespace std;

class Queen {
private:
	int Num;
	int Count;
	int* queenList;
public:
	Queen(int tempNum) {
		this->Num = tempNum;
		Count = 0;
		queenList = new int[Num] {0};
	}

	bool Attack(int row, int col) {
		bool beAttack = false;
		int i = 0;
		int offsetRow = 0;
		int offsetCol = 0;
		while (!beAttack && i<col) {
			offsetCol = abs(i - col);
			offsetRow = abs(queenList[i] - row);
			if (queenList[i] == row || (offsetRow == offsetCol))
				beAttack = true;
			i++;
		}
		return beAttack;
	}

	void PrintTable() {
		Count += 1;
		cout << "第" << Count << "组解" << endl;
		for (int x = 0; x < Num; x++) {
			cout << "\t";
			for (int y = 0; y < Num; y++) {
				if (x == queenList[y])
					cout << "<q>";
				else
					cout << "<->";
			}
			cout << endl;
		}
		system("pause");
	}

	void DecidePosition(int val) {
		int i = 0;
		while (i < Num) {
			if (!Attack(i, val)) {
				queenList[val] = i;
				if (val == (Num - 1))
					PrintTable();
				else
					DecidePosition(val + 1);
			}
			i++;
		}
	}
};

int main() {
	Queen* queen = new Queen(8);
	queen->DecidePosition(0);
	return 0;
}

输出结果

其他的N皇后测试结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1150260.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

博客模板博客模板

xservices-bpm-6.2.1.1.jar 本人详解 作者&#xff1a;王文峰&#xff0c;参加过 CSDN 2020年度博客之星&#xff0c;《Java王大师王天师》作者 公众号&#xff1a;山峯草堂&#xff0c;非技术多篇文章&#xff0c;专注于天道酬勤的 Java 开发问题、中国国学、传统文化和代码爱…

使用Objective-C和ASIHTTPRequest库进行Douban电影分析

概述 Douban是一个提供图书、音乐、电影等文化内容的社交网站&#xff0c;它的电影频道包含了大量的电影信息和用户评价。本文将介绍如何使用Objective-C语言和ASIHTTPRequest库进行Douban电影分析&#xff0c;包括如何获取电影数据、如何解析JSON格式的数据、如何使用代理IP技…

文心一言 VS 讯飞星火 VS chatgpt (124)-- 算法导论10.5 5题

五、用go语言&#xff0c;给定一个n结点的二叉树&#xff0c;写出一个 O(n)时间的非递归过程&#xff0c;将该树每个结点的关键字输出。要求除该树本身的存储空间外只能使用固定量的额外存储空间&#xff0c;且在过程中不得修改该树&#xff0c;即使是暂时的修改也不允许。 文…

ice和Dtls 传输的创建及1个简单的SFU转发实例

ice和Dtls 传输的创建及1个简单的SFU转发实例 licode中,webrtcconn基于dtlstransport 收发,而dtlstransport通过libnice作为底层。dtlstransport 使用了srtp加解密。文末给出一个简化的sfu实例的实现。对应的,看下M98的代码,更能理解为啥这么做: IceTransportInternal 与D…

Transformer模型原理

NLP预训练模型的架构大致可以分为三类&#xff1a; 1. Encoder-Decoder架构&#xff08;T5&#xff09;&#xff0c;seq2seq模型&#xff0c;RNN、LSTM网络 2. BERT&#xff1a;自编码语言模型&#xff0c;预测文本随机掩码 3. GPT&#xff1a; 自回归语言模型&#xff0c;预测…

Elasticsearch(一)---搭建

搭建es 不允许root用于运行 创建esuser用户&#xff1a; useradd esuser 设置密码 passwd esuser 让esuser拥有sudo的权限&#xff0c;需要修改/etc/sudoers文件 需要先给/etc/sudoers添加写的权限 [rootnode1 ~]# vim /etc/sudoers 改完之后将写权限删除 三台服务器上操…

“阿里巴巴按关键字搜索接口:一键获取海量商品信息,助力商家抢占市场先机!“

阿里巴巴按关键字搜索商品的接口是通过开放平台提供的API接口来实现的。要使用这个接口&#xff0c;需要进行以下步骤&#xff1a; 确认API接口的请求地址和所需参数&#xff1a;需要先查看API文档&#xff0c;了解所要访问的API接口的请求地址和请求参数&#xff0c;以便正确…

python随手小练13

题目1&#xff1a; 定义学员信息类&#xff0c;包含姓名、成绩属性&#xff0c;定义成绩打印方法 (90分及以上显示优秀&#xff0c;80分及以上显示良好&#xff0c;70分及以上显示中等&#xff0c;60分及以上显示合格&#xff0c;60分以下显示不及格) 具体操作&#xff1a; cl…

基于pyqt5和yolov8的智慧工地施工人工安全检测系统

基于pyqt5和yolov8的智慧工地施工人工安全检测系统 主要基于两者进行集成 在前面模型训练基础上&#xff0c;实现安全马甲、安全面具和安全帽的检测。 核心检测代码 def run(self):self.hilo_corriendo Truemodel YOLO("best.pt")cap cv2.VideoCapture(0)while…

安全生产管理系统助力企业安全细化管理

安全生产管理系统利用完整的安全生产管理体系&#xff0c;结合信息化、数字化和智能化等技术手段&#xff0c;将安全生产过程中的各个环节进行有效整合&#xff0c;使安全管理更加科学、规范和高效。 安全生产管理系统可以对企业安全生产进行全面、细致的管理。它能够实现对企…

NFTScan | 10.23~10.29 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期&#xff1a;2023.10.23~ 2023.10.29 NFT Hot News 01/ sudoswap 推出 NFT 做空协议 sudoshort 10 月 24 日&#xff0c;NFT 交易协议 sudoswap 推出 NFT 做空协议 sudoshort&#xff0c;是建立在 su…

C语言C位出道心法(一):基础语法

一:基础语法认知 变量与常量,数据类型认知升维 C语言中各种变量的定义及数据类型的认知: 一般而言,在譬如C等高级编程语言中,我们定义不同的类型的变量,需要不同的数据类型来进行声明,不同类型的数据类型声明的变量占用的内存空间不一样; 而数据类型大致分为两种: (1)内置的…

ORACLE运行的数据库突然连接报“无监听程序”

远程&#xff1a;用远程的数据库连接工具用localhost可以连接&#xff0c;用ip地址除127.0.0.1不可连接。 可能是日志文件满了&#xff0c;解决办法如下&#xff1a; 第一步&#xff1a;关闭数据库监听程序【任务管理器--》服务--》右键停止服务】 第二步&#xff1a;找到日志…

安防视频监控平台EasyCVR服务器需要开启firewalld防火墙,该如何开放端口?

智能视频监控/视频云存储/集中存储/视频汇聚平台EasyCVR具备视频融合汇聚能力&#xff0c;作为安防视频监控综合管理平台&#xff0c;它支持多协议接入、多格式视频流分发&#xff0c;视频监控综合管理平台EasyCVR支持海量视频汇聚管理&#xff0c;可应用在多样化的场景上&…

参与国际大科学计划!DDE 深时数字地球向您发出平台使用邀请

深时数字地球&#xff08;Deep-time Digital Earth&#xff0c;DDE&#xff09;是由我国科学家主导发起并受国际学术界认可的首个大科学计划&#xff0c;希望通过建立一个链接地学信息的研究平台&#xff0c;整合地球演化数据、共享全球地学知识&#xff0c;同时为世界范围内的…

【兔子王赠书第4期】用ChatGPT轻松玩转机器学习与深度学习

文章目录 前言机器学习深度学习ChatGPT推荐图书粉丝福利尾声 前言 兔子王免费赠书第4期来啦&#xff0c;突破传统学习束缚&#xff0c;借助ChatGPT的神奇力量&#xff0c;解锁AI无限可能&#xff01; 机器学习 机器学习是人工智能领域的一个重要分支&#xff0c;它的目的是让…

网络安全(黑客)—零基础自学

目录 一、自学网络安全学习的误区和陷阱 二、学习网络安全的一些前期准备 三、网络安全学习路线 四、学习资料的推荐 想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客&#xff01; 网络安全可以基于攻击和防御视角来分类&am…

GIS开源工具分享,Geojson格式转Topojson格式,使用TopoJSON Server工具进行Geojson转换为Topojson

前言 为什么要将 GeoJSON 转换为 TopoJSON? 因为TopoJSON会把GeoJSON中的冗余数据精简,所以相同数据TopoJSON体积比GeoJSON更小,更利于存储和传输。 Geojson介绍 GEOJSON是gis地图中常用的数据格式,制作地图时用于存储各种地理数据,使用时通过OpenLayer、Leaflet、mapL…

Java char类型介绍

前言&#xff1a;最近&#xff0c;想写一篇关于介绍产生”乱码问题“根本原因的文章&#xff0c;因此&#xff0c;查看了Java中的字符是如何存储的&#xff0c;即char数据类型。在此将学到的知识做一个总结。 一、char数据类型 char类型最初用于表示Unicode字符集中的一个字符…

LeetCode | 17.04.消失的数字和189.旋转数组

LeetCode | 17.04.消失的数字和189.旋转数组 文章目录 LeetCode | 17.04.消失的数字和189.旋转数组17.04.消失的数字方法一&#xff1a;方法二&#xff1a;方法三&#xff1a;方法二的代码方法三的代码 189.旋转数组思路一思路二思路三 17.04.消失的数字 OJ链接 这里题目要求…