深入理解数据结构——堆栈应用(四染色算法)

2023-11-20

#include <iostream>
#include <string>

using namespace std;



typedef char Etype;

/************************四染色算法*************************/
#define PRODUCTS EType

struct PRODUCTS {
	char name[8];
	int weight;
	int number;
	char place[20];
};



struct MAP {
	int AreaIndex;
	int color;
	char palce[20];
};

struct SType {
	int AreaIndex;
	int ColorIndex;
};

struct Stack {
	SType* element;
	int top;
	int maxsize;
};

//创建空堆栈
void CreateStack(Stack& S, int MaxStackSize) {
	S.maxsize = MaxStackSize;
	S.element = new SType[S.maxsize];//创建数组元素
	S.top = -1;//top指向的是数据空间的第一个元素,本身的值代表数据元素的下表,空表设top为-1
}

//判断堆栈是否为空
bool IsEmpty(Stack& S) {
	if (S.top == -1) return true;
	else return false;
}

//判断堆栈是否满了
bool IsFull(Stack& S) {
	if (S.top >= S.maxsize - 1) return true;
	else return false;
}

//返回栈顶元素的值
bool GetTop(Stack& S, SType& result) {
	if (IsEmpty(S)) return false;
	result = S.element[S.top];
	return true;
}

//出栈操作,将栈顶元素取出,并且将top指向下一个元素的位置
bool Pop(Stack& S, SType& result) {
	if (IsEmpty(S)) return false;
	result = S.element[S.top];
	S.top--;//栈顶指向下一个元素地址
	return true;
}

//进栈操作,将top+1,输入元素存入新的栈顶
bool Push(Stack& S, SType& x) {//传入的是x的地址
	if (IsEmpty(S)) return false;
	S.top++;
	S.element[S.top] = x;
	return true;
}

Stack MapColor(int r[8][8], int n) {
	//将地图用四种颜色染色,n个地区间的相邻关系在r数组中表示

	int currentArea = 1;//当前准备染色区域编号,从1号开始
	int currentColor = 1;//当前准备染色色素编号,从1号开始
	Stack S;//定义染色堆栈
	SType x;//SType 是堆栈元素的数据类型
	int topkeep;
	bool flag;
	int MaxStackSize = 10;
	CreateStack(S, MaxStackSize);

	x.AreaIndex = currentArea;
	x.ColorIndex = currentColor;

	Push(S, x);//1号地区以1号色素染色,入栈
	currentArea++;//地区编号加一,为新的地区染色

	while (currentArea <= n) {
		topkeep = S.top;//保留当前栈顶指针
		flag = true;	//flag为真时,表示与堆栈中易染色的区域比较时未发现重色
		while (!IsEmpty(S) && flag) {
			Pop(S, x);//读取栈中的一个数据
			if (x.ColorIndex == currentArea && r[currentArea][x.AreaIndex]) {
				//从栈中读出的区域已使用色素与当前准备染色区域要使用的色素相同,且两个区域相连
				flag = false;
				//无法使用当前色素,需要改变色素或者退栈,结束比较
			}
		}
		if ((IsEmpty(S)) &&(x.ColorIndex != currentColor)
			||(IsEmpty(S)&&!r[currentArea][x.AreaIndex])) {
			//与已染色区域比较,无一同色
			//将当前区域号及使用色素进栈,并准备下一区域号,从色素1开始尝试
			x.AreaIndex = currentArea;
			x.ColorIndex = currentColor;
			S.top = topkeep;
			Push(S, x);
			currentArea++;
			currentColor = 1;
		}
		else {
			currentColor++;//准备用下一色素,重新尝试
			S.top = topkeep;//从栈顶开始尝试
			while (currentColor > 4) {
				//如果当前使用色素或推出的栈顶使用的色素超过4,说明栈顶染色不对,需要退栈
				Pop(S, x);
				currentColor = x.ColorIndex + 1;
				currentArea = x.AreaIndex;
			}
			flag = true;
		}
	}
	return S;


}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深入理解数据结构——堆栈应用(四染色算法) 的相关文章

  • MongoDB C# 驱动程序检查身份验证状态和角色

    这是我使用 MongoDB 身份验证机制登录 MongoDB 的代码 try var credential MongoCredential CreateMongoCRCredential test admin 123456 var sett
  • 高级 Win32 图像文件 I/O?

    我想在 Windows C 应用程序中将图像文件读入内存 什么是一个相当简单的解决方案 也许类似于 IOS 提供的UIImage 我希望支持合理数量的文件格式 我需要为图像处理的位图提供一些低级访问权限 我在互联网上阅读了很多内容 看起来
  • 如何知道并加载特定文件夹中的所有图像?

    我有一个应用程序 C Builder 6 0 需要知道特定文件夹中的图像总数 然后我必须加载它们 在 ImageList 或 ComboBoxEx 中 或任何其他控件中 我怎样才能做到这一点 我知道如何在控件中加载图像 或保存在 TList
  • LINQ to XML - 如何正确使用 XDocument

    现在我首先要说的是 这确实是一项任务 然而 在我遇到 Linq to XML 语法之前 我几乎已经完成了它 我有 2 个课程 曲目和 CD 现在作为作业的一部分 我创建了一张 CD 然后向其中添加了一些曲目 在搜索了大量完美解释了如何从 x
  • 测试 hdf5/c++ 中的组是否存在

    我正在打开一个现有的 HDF5 文件来附加数据 我想向那个叫做的小组保证 A存在以供后续访问 我正在寻找一种简单的方法来创建 A有条件地 如果不存在则创建并返回新组 或者返回现有组 一种方法是测试 A存在 我怎样才能高效地做到这一点 根据
  • 有没有比这更快的方法来查找目录和所有子目录中的所有文件?

    我正在编写一个程序 需要在目录及其所有子目录中搜索具有特定扩展名的文件 这将在本地驱动器和网络驱动器上使用 因此性能是一个问题 这是我现在使用的递归方法 private void GetFileList string fileSearchP
  • 使用 C# 使用应用程序密码登录 Office 365 SMTP

    在我们的 Office 365 公司帐户中实施两步身份验证之前 我的 C WPF 程序已成功进行身份验证并发送邮件 我使用了 SmtpClient 库 但现在我必须找到另一个解决方案 因为它不再起作用 我找不到任何使用 O365 应用程序密
  • 浮点提升:stroustrup vs 编译器 - 谁是对的?

    在 Stroustrup 的新书 C 编程语言 第四版 第 10 5 1 节中 他说 在执行算术运算之前 整数提升用于从较短的整数类型创建整数 类似地 浮点提升是用于从浮点数创建双精度数 我用以下代码确认了第一个声明 include
  • 使用 VSTO 更改 Outlook 设置

    我刚刚花了大约 4 个小时试图弄清楚如何以编程方式检索 设置 Microsoft Outlook 2010 的 Outlook 设置 我所说的 设置 是指文件 选项 邮件下的设置 我想做的是检索用户设置的设置列表 自动化我们每天需要在某些消
  • C中有const吗?

    这个问题可能很幼稚 但是 有没有constC 中的关键字 从哪个版本开始 之间有任何语义和 或句法差异吗const在 C 和 C 中 C 和 C 之间在语法上没有差异const关键字 除了一个相当晦涩的关键字 在 C 中 自 C99 起 您
  • C#:使用 System.Text 和 System.Text.RegularExpressions 之间的区别

    在 ASP NET C 应用程序中 我注意到为了使用 Regex 和 StringBuilder 我必须将两者都放在 using System Text using System Text RegularExpressions 从简单的角度
  • 推送 Lua 表

    我已经创建了一个Lua表C 但我不知道如何将该表推入堆栈顶部 以便我可以将其传递给 Lua 函数 有谁知道如何做到这一点 这是我当前的代码 lua createtable state libraries size 0 int table i
  • for 循环 - 没有效果的语句

    由于某种原因 我收到错误 statement with no effect关于这个声明 for j idx j lt iter j increment printf from loop idx i int idx punc ctxt j 你
  • C#:如何使用 SHOpenFolderAndSelectItems [重复]

    这个问题在这里已经有答案了 有人可以举例说明如何使用 shell 函数吗SH打开文件夹并选择项目 http msdn microsoft com en us library bb762232 VS 85 aspx来自 C 我不太明白如何使用
  • OpenMP C 程序运行速度比顺序代码慢

    我是 OpenMP 的新手 正在尝试并行化 Jarvis 的算法 然而事实证明 与顺序代码相比 并行程序花费的时间要长 2 3 倍 难道问题本身就不能并行化吗 或者我并行化它的方式有问题 这是我针对该问题的 openMP 程序 其中有 2
  • 为什么我不能在扩展 List 的类中调用 OrderBy?

    我有一堂课 Deck 其中包含一个名为的方法Shuffle 我正在致力于重构Deck延长List
  • 如何使复选框不可选择?

    我想知道你是怎么做的CheckBox在c 中无法选择 我认为这会是类似 SetSelectable false 之类的东西 但我似乎看不到该方法 I found CanSelect但这似乎是只读属性 您可以设置自动检查 http msdn
  • Windows 上 libcurl 的静态库[重复]

    这个问题在这里已经有答案了 如何将此库 libcurl 静态链接到 exe 我努力了 disable share enable static 没有帮助 我使用的是MingW32 有没有一种简单的方法来静态链接这个库 这样我的应用程序就不再有
  • 当我读取 500MB FileStream 时出现 OutOfMemoryException

    我使用 Filestream 读取大文件 gt 500 MB 但出现 OutOfMemoryException 任何有关它的解决方案 我的代码是 using var fs3 new FileStream filePath2 FileMode
  • 在 C# 中读取/写入命令行程序

    我正在尝试与 C 的命令行程序进行对话 它是一个情绪分析器 它的工作原理如下 CMD gt java jar analyser jar gt Starting analyser 这是我想从我的 C 程序插入内容的地方 例如 I love y

随机推荐

  • 【pytorch目标检测】创新之作:Fast R-CNN算法解读

    背景 2015年 提出了Fast RCNN算法 训练步骤实现端到端 CNN 基于VGG6 Fast R CNN是基于R CNN和SPPnets进行的改进 成果 训练速度比RCNN块9倍 测试速度快乐23倍 准确率68 4 SPPnets网络
  • Python实现PDF合并工具(含源码)

    在工作中 每个月都会要遇到报账的情况 在现如今很多都是使用电子发票 获得的电子发票很多都是PDF格式 偶尔也有图片格式的 而且还是一张发票一个pdf文档 在打印贴票时 就需要一个文档一个文档的打开打印 十分的不便捷 当然也可以使用某某PDF
  • Trello中的Scrum

    Trello的用户数量近期超越了1000万的大关 它正迅速成为各色敏捷团队中流行的工具 它的简洁及在Web 移动端优秀的体验 使它从众多更复杂的解决方案中脱颖而出 赢得了更多的团队 因为Trello完全不在意用户如何使用 所以导致用户在用它
  • Mysql 基础

    判断数据库是否存在 存在就删除 drop database if exists testdb 创建数据库表的操作 create database testdb 使用数据库 use testdb 判断创建的表是否存在 存在就删除 drop t
  • 2021年12月-电子学会青少年等级考试C语言(一级)真题与解析

    2021年12月软件编程 C语言 等级考试 一级 分数 100 题数 5 时间限制 1000 ms 内存限制 65536 kB 1 输出整数部分 题目描述 输入一个双精度浮点数 输出其整数部分 输入 一个双精度浮点数f 0 lt f lt
  • PMD规则开发实战:打造自己的代码质量检测工具

    PMD介绍 介绍 PMD 安装和配置 如何安装和配置 PMD 插件以在的项目中使用 IDEA中如何使用PMD插件 Java项目中如何使用PMD PMD规则开发介绍 介绍如何编写和使用自定义 PMD 规则 SonarQube如何集成PMD S
  • Java 数据输入

    数据输入 数据输入概述 Java 提供接口用于接受控制台输入的变量 并进行相应的操作 Scanner 使用的基本步骤 导包 import java util Scanner 导包的动作必须出现在类定义的上面 创建对象 Scanner sca
  • 网易资深安卓架构师:没想到一个Handler还有中高级几种问法,论程序员成长的正确姿势

    本专栏专注分享大型Bat面试知识 后续会持续更新 喜欢的话麻烦点击一个关注 面试官 组件化如何实现 组件化与插件化的差别在哪里 该怎么选型 心理分析 面试官从架构层次 了解求职者是否用过 模块化 组件化 和插件化 在过去经验有没有运用过这些
  • 【Spring Boot 初识丨三】starter

    上一篇讲了如何构建MAVEN项目 本篇来讲一讲 starter 依赖项 Spring Boot 初识 Spring Boot 初识丨一 入门实战 Spring Boot 初识丨二 maven Spring Boot 初识丨三 starter
  • 【Android Studio 创建module】

    一 如何创建模型 一个项目里边可以有多个module 每个module对应的都是一个独立的程序 选择File菜单 gt New gt New Module gt 填写Module名称 library 一直next直到finish 给Modu
  • 如何从零开始搭建公司自动化测试框架?

    搭建的自动化测试框架要包括API测试 UI测试 APP测试三类 以上三类其实可以简化为两类 那就是 1 接口自动化测试框架搭建 2 UI自动化测试框架搭建 没问题 安排 且是手把手教你如何搭建以上两类自动化测试框架 回到这篇主题 刷到这个问
  • linux c语言常见面试题及答案,Linux下C语言的几道经典面试题小结(分享)

    Linux下C语言的几道经典面试题小结 分享 本篇文章整理了几道Linux下C语言的经典面试题 相信对大家更好的理解Linux下的C语言会有很大的帮助 欢迎大家探讨指正 1 如果在Linux下使用GCC编译器执行下列程序 输出结果是什么 答
  • Android中的进程与多线程的讲解(Handler和AsyncTask)

    Hello EveryBody 又到了我们相聚的时间了 今天要总结的东西现在有点迫不及待了 因为在实际的应用中如果用不到它 我们就不能再听歌的同时发送信息 其实大家应该都知道了 今天的主角就是进程与多线程 好了 其他的不多说 直接进入正题吧
  • C++中int 转char

    C 中int 转char int a 10 0 1 2 3 4 5 6 7 8 9 char b a 1 0 则b 的值为字符 1
  • 在Mysql中如何显示所有用户?

    这是一个mysql初学者经常问到的一个问题 今天我们就带大家看看是如何在Mysql中显示所有用户的 通常我们在mysql中使用SHOW DATABASES可以显示所有的数据库 SHOW TABLES将会显示所有的数据表 那么你是不是会猜测显
  • 电脑设备中PCI简易通讯控制器驱动显示黄色感叹号图标怎么办【申明:来源于网络】

    电脑设备中PCI简易通讯控制器驱动显示黄色感叹号图标怎么办 申明 来源于网络 电脑设备中PCI简易通讯控制器驱动显示黄色感叹号图标 http wenda so com q 1467255688725898
  • CSS中的cursor属性

    1 CSS cursor 属性 1 问题描述 最近在项目中 碰到这样一个问题 设置了一个div盒子 点击盒子会触发事件 弹出一个弹框 但是在鼠标移到这个盒子的时候 鼠标的箭头并没有变成一只手的形状 经过查阅资料发现elementUI的按钮
  • 关于Linux下的stat()函数

    文章目录 一 stat 的组成 二 具体使用 1 简单的ls程序 2 运行结果如下 一 stat 的组成 头文件 include
  • 机器学习入门——线性代数简单回顾

    本节课程回顾了一些简单但常用的线性代数知识 很基础的 我会直接跳过 并对矩阵的一些运算进行编程实现 3 1 矩阵的加法和标量乘法 矩阵加法 要求行列数要相等 然后 每个元素对应相加 exp 矩阵的标量乘法 每个元素都要乘 exp 3 2 矩
  • 深入理解数据结构——堆栈应用(四染色算法)

    include