四色问题的一般解----C语言实现
四色定理(世界近代三大数学难题之一),又称四色猜想、四色问题,是世界三大数学猜想之一。
四色问题的内容是“任何一张地图只用四种颜色就能使具有共同边界的国家着上不同的颜色。”也就是说在不引起混淆的情况下一张地图只需四种颜色来标记就行。
用数学语言表示即“将平面任意地细分为不相重叠的区域,每一个区域总可以用 0 1 2 3 这四个数字之一来标记而不会使相邻的两个区域得到相同的数字。”这里所指的相邻区域是指有一整段边界是公共的。如果两个区域只相遇于一点或有限多点就不叫相邻的。
四色猜想看来是一个带有数学游戏性质的孤立的问题,可是它却创造出图论许多新的分支。数学家的本事在于他们能够把复杂的事物变成简单的对象。从四色问题就可以做这样的化简:一个区域不妨看成一个点,任何两个区域或者相邻(也就是公用一条边界),或是不相邻。如果代表两个区域地点相邻,那么我们就在两点之间连上一条线,否则就不连线。这样的结构就称为图。四色问题也就变成图的顶点着色的问题,也就是两顶点如果有线相连,则必须涂上不同颜色。
本文用C语言图论中的邻接矩阵实现。具体源代码如下:
#include<stdio.h>
#include<stdlib.h>typedef struct graph {int Vertices;int** A;
}Graph;void CreateGraph(Graph *g, int n ) {int i, j;g->Vertices = n;g->A = (int**)malloc(n*sizeof(int*));for (i = 0; i < n;i++) {g->A[i] = (int*)malloc(n*sizeof(int));for (j = 0; j < n;j++) {g->A[i][j] = 0;}}
}void Add(Graph*g, int u,int v) {if (u < 0 || v < 0 || u > g->Vertices - 1 || v>g->Vertices - 1 || u == v || g->A[u][v] != 0) {printf("BadInput\n");}else {g->A[u][v] = 1;g->A[v][u] = 1;}
}void Delete(Graph *g, int u, int v) {if (u < 0 || v < 0 || u > g->Vertices - 1 || v>g->Vertices - 1 || u == v || g->A[u][v] == 0) {printf("BadInput\n");}else {g->A[u][v] = 0;printf("Delete Successfully\n");}
}void Exist(Graph* g, int u, int v) {if (u < 0 || v < 0 || u > g->Vertices - 1 || v>g->Vertices - 1 || u == v || g->A[u][v] == 0) {printf("No Existance\n");}else {printf("Element Exists!\n");}
}void PrintMatrix(Graph* g) {int i,j;for (i = 0; i < g->Vertices;i++) {for (j = 0; j < g->Vertices;j++) {printf("%-5d",g->A[i][j]);}printf("\n");printf("\n");}printf("***************\n");
}int MapColor(Graph* g) {int i, j, k, m, n;int* verticesArray = (int*)malloc(g->Vertices * sizeof(int));int colorPool[4] = { 0 };for (k = 0; k < g->Vertices; k++){verticesArray[k] = -1;}for (i = 0; i < g->Vertices; i++) {for (m = 0; m < 4; m++){colorPool[m] = 0;}if (verticesArray[i] == -1){for (j = 0; j < g->Vertices; j++) {if (colorPool[0] == 1 && colorPool[1] == 1 && colorPool[2] == 1 && colorPool[3] == 1){printf("颜色池全部用完了,四色定理失效!基本不可能发生");return 0;}if (g->A[i][j] ==1 && verticesArray[j] != -1){colorPool[verticesArray[j]] = 1;}}for (m = 0; m < 4; m++){if (colorPool[m] == 0){verticesArray[i] = m;colorPool[m] = 1;break;}}}else {continue;}for (j = 0; j < g->Vertices; j++) {if (colorPool[0] == 1 && colorPool[1] == 1 && colorPool[2] == 1 && colorPool[3] == 1){break;}else {if (g->A[i][j] == 1 && verticesArray[j] == -1){for (m = 0; m < 4; m++){if (colorPool[m] == 0){verticesArray[j] = m;colorPool[m] = 1;break;}}}}}}for (int n = 0; n < g->Vertices; n++){printf("%-5d %-5d\n", n, verticesArray[n]);}free(verticesArray);return 1;
}void main() {Graph* g;g = (Graph*)malloc(sizeof(Graph));CreateGraph(g, 8);//PrintMatrix(g);Add(g, 4, 0);Add(g, 4, 1);Add(g, 4, 2);Add(g, 4, 3);Add(g, 4, 6);Add(g, 4, 5);Add(g, 1, 0);Add(g, 1, 2);Add(g, 3, 2);Add(g, 3, 6);Add(g, 5, 6);Add(g, 5, 0);Add(g, 7, 0);Add(g, 7, 5);//Delete(g, 1, 0);PrintMatrix(g);MapColor(g);}
运行结果:
0 1 0 0 1 1 0 1
1 0 1 0 1 0 0 0
0 1 0 1 1 0 0 0
0 0 1 0 1 0 1 0
1 1 1 1 0 1 1 0
1 0 0 0 1 0 1 1
0 0 0 1 1 1 0 0
1 0 0 0 0 1 0 0
顶点 颜色
0 0
1 1
2 0
3 3
4 2
5 3
6 0
7 1
四色问题的一般解----C语言实现相关推荐
- 【我解C语言面试题系列】013 以单词为单位的翻转字符串
[我解C语言面试题系列]013 以单词为单位的翻转字符串 以单词为单位的翻转字符串 原题:Write a function string reverse string word By word (St ...
- 数据结构习题精解 C语言实现+微课视频(习题解答、研考试题、微课视频)
数据结构习题精解 C语言实现+微课视频(习题解答.研考试题.微课视频) 配套 数据结构.数据结构C语言实现等经典教材的课后习题解答,著名高校典型考研试题详解.微课视频
- 《明解C语言》pdf
下载地址:网盘下载 <明解C语言>图文并茂,示例丰富,设有190段代码和164幅图表,对C语言的基础知识进行了彻底剖析,内容涉及数组.函数.指针.文件操作等.对于C语言语法以及一些难以理解 ...
- #转载:杨辉三角形实现过程详解-c语言基础
杨辉三角形实现过程详解-C语言基础 十一一个人 2018-12-26 06:45:45 6465 收藏 28 最后发布:2018-12-26 06:45:45首发:2018-12-26 06:45:4 ...
- DBus glib 各数据类型接收与发送详解—C语言(3)
DBus glib 各数据类型接收与发送详解-C语言(3) 动机 前置知识 正文 Python 测试服务 使用 C 实现复杂数据类型的传递 DICT_DICT ObjectPath_Dict_Stru ...
- 【我解C语言面试题系列】003 死循环格式问题小结?
[我解C语言面试题系列]003 死循环格式问题小结? 死循环格式问题小结 下面是几个"著名"的死循环: (1)操作系统死循环: (2)WIN32程序死循环: (3)嵌入式系统软件死 ...
- 详解go语言的array和slice 【二】
上一篇 详解go语言的array和slice [一]已经讲解过,array和slice的一些基本用法,使用array和slice时需要注意的地方,特别是slice需要注意的地方比较多.上一篇的最后讲 ...
- 武林c语言,详解C语言中条件编译
预处理器提供条件编译,程序的不同部分可以在不同的条件下编译,从而产生不同的目标代码文件,这对于程序移植和调试非常有用,本文是武林技术频道小编给为大家带来的详解中条件编译,一起来了解一下吧! 通常情况, ...
- c语言malloc用法 数组,详解C语言用malloc函数申请二维动态数组的实例
详解C语言用malloc函数申请二维动态数组的实例 C语言在程序运行中动态的申请及释放内存十分方便,一维数组的申请及释放比较简单. Sample one #include int main() { c ...
最新文章
- linux下Qt调用C++库文件(.so)程序实现
- ECMA_作用域深入This关键字
- 新手探索NLP(十一)——知识图谱
- iOS:弹出窗控制器:UIPopoverController
- win7构建成功helloworld驱动、WDF驱动中KMDF与UMDF区别
- if语句 power query_PowerQuery学习:认识M函数
- 一个故事 让你看懂“区块链”
- 面向对象方法开发的方法
- mysql insert 错误码_利用 MySQL 自身错误诊断区域-爱可生
- java spark wordcount_提交任务到spark(以wordcount为例)
- python的前端开发_python开发 - 包子博客 _ 关注互联网前端、开发、SEO、移动互联网应用技术...
- YACC、LEX、JAVACC-------常用的编译工具
- 问答| car-like robot为何需要设置多个坐标系?
- 吴恩达新书《Machine Learning Yearning》完整中文版PDF
- mysql pxc缺点_MYSQL高可用之PXC
- intel 显卡使用cuda吗
- 雪球 feed流爬虫
- 苹果手机互传一键换机
- 我叫mt4最新服务器,我叫mt4怎么看服务器等级上限 经验上限查看方法详解
- 奥巴马演讲:我们需要的变革
热门文章
- 杜克计算机工程本科专业申请,Duke-C同学斩获2015 杜克大学 计算机工程硕士Offer一枚...
- 【Java基础】NoClassDefFoundError 和 ClassNotFoundException的定义及其区别
- PySide2中使用QLabel的setPixmap方法显示图片,部分图片无法显示
- Chrome光标在非输入状态下仍然闪烁
- 上海汉得校招面试指南(写给应届找工作的你)
- 瑞萨单片机RL78-时钟
- 使用晨曦记账本,记录流水账及记录借还款
- 《国资报告》专访高煜光 | 国企数字化转型如何拥抱超自动化?
- 拆解国企数字化转型的锦囊
- r语言怎么做经验分布_训练宝宝语言能力应该怎么做