四色问题又称四色猜想、四色定理,是世界三大数学猜想之一。四色定理是一个著名的数学定理,通俗的说法是:每个平面地图都可以只用四种颜色来染色,而且没有两个邻接的区域颜色相同。1976年借助电子计算机证明了四色问题,问题也终于成为定理,这是第一个借助计算机证明的定理。(这段文字来源于百度百科)

这篇文章主要介绍利用C语言实现地图四色着图。主要包括:设计的数据结构;算法实现等。

1 着图的数据结构

着图时无需表示具体的地图多边形,只需要表示多边形的Voronoi图即可,说的简单点可见下图:

对于左边的地图多边形,在算法中只需要表示成图形右边的即可。其中结点(v1, v2…)表示的是地图多边形,结点的连线表示两个多边形之间是比邻的关系。

因此在数据结构中只需要表示成图的形式即可。这里采用“邻接表”的数据结构,如下:

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20
typedef struct ArcNode {int adjvex; //该边指向的顶点的位置struct ArcNode *nextarc; //指向下一条边的指针
} ArcNode, *ArcNList;
typedef struct {float x;float y;
} Vertex; //点
typedef struct VNode {Vertex data; //顶点信息ArcNList firstarc; //指向第一条依附该顶点的边的指针int color; //该点的颜色
} VNode, AdjList[MAX_VERTEX_NUM];
typedef struct{ AdjList vertics; int vexnum, arcnum; //该图的当前顶点数和边数
} UDGraph;

2 着图的算法

着色的算法采用回溯法。基本思路为:首先对一个多边形进行着色,着色后判断是否满足要求,如果满足要求则继续对其他多边形进行着色;如果不满足要求则撤销当前着色并回溯,采用其他着色方案。递归如此,直到地图全部着色完成。

地图四色染图的C语言代码实现如下。其首先给定地图最多使用的颜色数量为4,判断能否只利用4种颜色对地图进行着色,如果能则返回true,反之则返回false。

bool isColorOK(UDGraph G, int node) { //判断对第node个结点着色的方案行不行VNode V = G.vertics[node - 1];ArcNList T = V.firstarc;while(T) {if(V.color == G.vertics[T->adjvex].color) return false;T = T->nextarc;}return true;
}
bool getColorPowset(UDGraph &G, int color_Num, int step, int a, int b) { //**回溯法对图着色if(step > G.vexnum) {if(G.vertics[a-1].color == b) { //在a区域图上了b色return true;}} else {int i;for(i=1; i<=color_Num; i++) {G.vertics[step - 1].color = i;if(isColorOK(G, step)) {if(getColorPowset(G, color_Num, step + 1, a, b)) return true;}G.vertics[step - 1].color = 0;}}return false;
}

3 测试运行

测试过程的代码包括:建图的过程、输出着色结果的过程。这两个过程的代码如下:

int createUDGraph(UDGraph &G) {int a, b, i;ArcNList p;printf("请输入结点的个数和边的个数:");scanf("%d,%d", &(G.vexnum), &(G.arcnum));getchar(); //消除回车for(i=0; i<G.vexnum; i++) {//初始化各结点G.vertics[i].firstarc =NULL;G.vertics[i].color = 0;}printf("请输入这%d个点之间的拓扑关系:\n", G.vexnum);//接下来就是创建这G.arcnum*2个边for(i=1; i<=G.arcnum; i++) {scanf("%d,%d", &a, &b); //表明a点和b点之间向邻接,在a点和b点之间连上线getchar();//消除回车p = (ArcNList)malloc(sizeof(ArcNode)); if(!p) exit(-2);p->adjvex = b - 1;p->nextarc = G.vertics[a - 1].firstarc;G.vertics[a - 1].firstarc = p;//以上是在a点上加上一个结点,一下是在b点上加上一个结点p = (ArcNList)malloc(sizeof(ArcNode)); if(!p) exit(-2);p->adjvex = a - 1;p->nextarc = G.vertics[b - 1].firstarc;G.vertics[b - 1].firstarc = p;}return 1;
}
void outputGraph(UDGraph G) {int i;for(i=0; i<G.vexnum; i++) printf("结点%d的着色方案为:%d\n", i+1, G.vertics[i].color);
}
int main() {int a, b;//a区域图b色UDGraph G;createUDGraph(G);printf("请输入一种着色方案(即哪一个区域着什么颜色):");scanf("%d,%d", &a, &b);//在a区域图上b色getchar();//消除回车if(getColorPowset(G, 4, 1, a, b)) {//如果最后的图色成功printf("图形图色成功,为:\n");outputGraph(G);} else printf("图形图色失败,方案不正确\n");//如果最后的图色成功return 1;
}

运行上述代码,测试如下:

其图形含义如下:

如果想自己编译运行,只需要将本文所有的代码拷贝到一起即可编译运行。

全文完。转载请注明出处。

地图四色着图的C语言实现相关推荐

  1. c语言电子地图程序,地图四色着图的C语言实现

    四色问题又称四色猜想.四色定理,是世界三大数学猜想之一.四色定理是一个著名的数学定理,通俗的说法是:每个平面地图都可以只用四种颜色来染色,而且没有两个邻接的区域颜色相同.1976年借助电子计算机证明了 ...

  2. Python实现地图四色原理的遗传算法(GA)着色实现

    1 任务需求   首先,我们来明确一下本文所需实现的需求.   现有一个由多个小图斑组成的矢量图层,如下图所示:我们需要找到一种由4种颜色组成的配色方案,对该矢量图层各图斑进行着色,使得各相邻小图斑间 ...

  3. 四色原型图进行业务建模的思考

    一般的需求,我们利用用例图就可以表达清楚了,如果再复杂些,我们可能还得再配合序列图.状态图等加于说明.但是,在非常复杂的业务逻辑中,怎么样才能找出它们的联系?而且还能更好地拥抱OO(面向对象),OO的 ...

  4. java 地图四色着色算法_趣味地图系列之6 四色定理之我见

    四色定理(four color map theorem)是一个著名的数学定理[1],即对任意的(平面上的)地图染色,要求相邻的国家颜色不同,四种颜色即可完成着色. 南非数学家法兰西斯·古德里在1852 ...

  5. java 地图四色着色算法_继陈景润之后周立敬攻破世界三大数学难题之一:地图四色难题...

    地图四色问题又称四色猜想,与哥德巴赫猜想.费马猜想一起并称为为世界三大数学猜想.世界三大数学难题. 1965年5月,陈景润发表论文<大偶数表示一个素数及一个不超过2个素数的乘积之和>,最接 ...

  6. java 地图四色着色算法_四色定理的简单证明:从四色猜想到四域公理

    摘要 "四色猜想"也称"四色定理",一直以来都没有一种简捷明快的证明方法,然而,本文认为"四色猜想"可以作为一个平面区域相邻关系的" ...

  7. 四色原型(转自banq大师)

    我们搞技术的有很多误区,比如经常陷入纯技术钻牛角尖的争辩,而全然不顾业务场景,技术活做太多,经验一箩筐,但是有时会疑惑,这些经验是否适合其他自己没有经历过的新系统呢?我们在技术设计路线上走得太久,容易 ...

  8. 索骥馆-编程语言之《程序语言的奥妙:算法解读(四色全彩)》扫描版[PDF]

    内容简介: 在我们生活的世界中,各种各样形形色色的事物和现象,其中都必定包含着科学的成分.在这些成分中,有些是你所熟知的,有些是你未知的,有些是你还一知半解的.面对未知的世界,好奇的你是不是有很多疑惑 ...

  9. 地图绘制和四色算法,图搜索算法,最小生成树算法,最短路径算法

    基于简易Web墨卡托计算实现地图绘制,四色染色,实现图的深度优先搜索,广度优先搜索,Kruskal算法最小生成树,Prime算法最小生成树,Dijkstra最短路径算法. 使用Java & S ...

最新文章

  1. 5G NGC — NSSF 网络切片选择功能
  2. XenApp_XenDesktop_7.6实战篇之十四:XenDesktop虚拟桌面的交付
  3. suse linux查版本号,查看SUSE版本号
  4. CodeForces - 1312C Adding Powers(思维+位运算)
  5. maven中pom.xml中的scope讲解
  6. .NET Core dotnet 命令大全
  7. C++ 引用和指针有什么区别?
  8. JavaScript异常处理
  9. mac苹果电脑安装非app store软件无法安装的解决办法
  10. 算法设计与分析基础(三)
  11. java万年历的两种实现方式
  12. 中心滤波与均值滤波MATLAB
  13. Java之简单人机五子棋(一)
  14. 旧电脑再次起飞 分享一次联想Thinkpad X230黑苹果的完整过程
  15. python提取url的顶级域名及域名后缀
  16. bfptr算法(即中位数的中位数算法)
  17. 网络推广100种方法_免费在线推广业务的6种方法
  18. 学生党如何拿到阿里技术offer
  19. 网吧台式计算机配置,2017网吧电脑配置
  20. AppStore审核

热门文章

  1. 游戏中的网络同步机制(一)帧同步Lockstep
  2. Quartz创建定时任务(入门)
  3. 随机种子 seed()
  4. 【经验】CV or NLP研究生如何学才能毕业找到一份好工作?
  5. linux图形图像驱动,Linux_Linux操作系统下USB图像采集驱动的安装,ARMlinux下USB摄像头图像的采集 - phpStudy...
  6. 怎么把HTML文件拉出来,怎么把网页HTML格式的文件
  7. UITableviewCell的花式操作
  8. json和gson傻傻分不清楚
  9. 福成股份很忙:实控人李福成被罚8万,新董事长李良则要打官司
  10. 台积电开始试产3nm ,苹果、Intel公司也有意向在跟进3nm技术