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

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

1 着图的数据结构

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

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

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

#include

#include

#include

#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.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

}

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语言电子地图程序,地图四色着图的C语言实现相关推荐

  1. 地图四色着图的C语言实现

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

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

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

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

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

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

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

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

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

  6. 用c语言编写程序学工系统,[工学]chap02_用C语言编写程序.ppt

    [工学]chap02_用C语言编写程序 Chap 2 用C语言编写程序 2.1 在屏幕上显示 Hello World! 2.2 求华氏温度 100°F 对应的摄氏温度 2.3 计算分段函数 2.4 输 ...

  7. 怎样查看C语言的程序内容,什么手机软件能看c语言文件?

    C语言编译器和C++编译器这2个手机软件就可以,而且还可以直接运行C语言程序,使用起来非常方便,下面我简单介绍一下这2个软件的安装和使用,感兴趣的朋友可以在自己手机上尝试一下: C语言编译器 这是手机 ...

  8. c语言编程基础第四版电子教案,《C语言编程基础》电子教案.doc

    <C语言编程基础>电子教案 课题(内容)1.1 C语言简史及特点课时1教学任务分析教学目标知识技能通过本节课的教学,使学生了解并熟悉编程语言C的发展历史.特点及其种类和适用范围.过程与方法 ...

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

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

最新文章

  1. 2021中国大学排名发布:北京大学连续14年位居榜首
  2. 2G---5G与未来天线技术
  3. 使用程序判断一个文件是否是有效的PE文件
  4. syslog记录history历史记录
  5. [图神经网络] 图神经网络GNN基础入门
  6. HTML-超链接锚点笔记
  7. php中常见的错误类型有,JavaScript编程中会出现的错误类型有哪些?错误类型介绍...
  8. Flink读数据 addSource
  9. Life is short, you need Python. ——Bruce Eckel
  10. inux中tail命令---用于查看文件内容
  11. 放眼世界,一个人重整WP的整套代码,唯吾一人
  12. 【POJ 1113】Wall【凸包+一点思维】
  13. 图片质量与ISO 光圈 快门 测光 曝光与曝光补偿 焦距和焦距转换系数 景深与光圈优先 白平衡与RAW
  14. 支付宝快捷支付接入问题
  15. linux 下使用 tc 模拟网络延迟和丢包-使用 linux 模拟广域网延迟 - Emulating wide area network delays with Linux...
  16. 继承nn.Module后的 init与forward函数【trian_val、vgg16、faster_rcnn、rpn】.py 学习 文件结构 大工程安排
  17. Javascript实现全屏阅读和复制功能
  18. JAVAWEB(三)Java与数据库(JUnit、JUL、Maven、图书管理系统)
  19. 中国石油大学(北京)-《汽车保险与理赔》作业
  20. 数据库设计之商品表分析2

热门文章

  1. Babel AST代码转换、生成
  2. MySQL读书笔记-事务隔离
  3. 名片识别 php,小程序云开发实战:实现 AI 智能名片识别小程序
  4. 全平台知识付费系统源码 支持微信小程序+公众号+H5+PC端 含搭建部署教程
  5. 使用并行的方法计算斐波那契数列 (Fibonacci)
  6. c语言编译常见错误提示,c语言编译常见错误
  7. 桩筏有限元中的弹性板计算_[转载]建研院关于桩筏计算几个问题的解答
  8. 【私有云架构】Openstack VS CloudStack:比较异同
  9. 河北新华计算机学校贴吧,读石家庄新华电脑学校“骗人黑幕”的幕后黑手???...
  10. 建筑平面图, 建筑设计图, 家具摆放图, 制作, 开发, 软件, VC++, 源代码组件库