GIS基础算法之地图着色问题

来源:互联网 发布:药家鑫该不该死 知乎 编辑:程序博客网 时间:2024/06/06 16:36
   今天在图书馆看到一个同学背着一个很有意思的书包,书包表面是由很多三角形拼接而成的并且只用四种不同颜色填充的,并且每个三角形与邻接三角形的颜色都是不一样的(我好想买一个这种书包。。。淘宝上找了好久没找到)。我突然想到我高中时候看过的一个问题---四色问题。非常非常蹊跷的是,在我做的考研真题中居然两年出现了这个题目。为了跟我的GIS主题相关,我特意把问题改成了地图着色问题。这里有一篇比较好的微博文章(一个中国台湾学者),推荐给大家,有助于大家理解四色题 http://blog.sina.com.cn/s/blog_491de9dd010003hz.html 。

     下面直接上图,解释什么是四色问题

图片

看了这张图,应该可以理解不少吧。今天我用一个效率不高的算法,去解决了对给定区域图内找出所有的着色方案(只用四种颜色)。

算法实现:#include <stdio.h>#define N 10//邻接矩阵int relations[N][N]={{0,0,0,0,0,0,0,0,0,0},{0,0,1,0,1,1,0,0,0,0},{0,1,0,1,1,1,1,0,0,0},{0,0,1,0,0,1,1,0,0,0},{0,1,1,0,0,1,0,1,1,0},{0,1,1,1,1,0,1,1,1,1},{0,0,1,1,0,1,0,0,1,1},{0,0,0,0,1,1,0,0,1,0},{0,0,0,0,1,1,1,1,0,1},{0,0,0,0,0,1,1,0,1,0}};//0代表不相连int count = 0;//统计有几种着色方案void print(int a[]){int i;count++;printf("第%d种着色方案:\n",count);for(i = 1;i < N;i++){printf("%d  ",a[i]);if(i%3==0){printf("\n");}}}//主要算法void MapMatchColor(int a[],int n)//a是配色数组,n是第几个需要配色的区域{int i;int colors[5] = {0,1,1,1,1};//这里0代表已经被使用,1代表还未被使用if(n == N){print(a);}else{for(i = 1;i<n;i++){if(relations[n][i])//如果第n个区域与前n-1个区域中有相邻边,则不能用与他们相同的颜色,赋值为0{colors[a[i]] = 0;}}for(i = 1;i < 5;i++){if(colors[i]){a[n] = i;MapMatchColor(a,n+1);//递归(回溯法)}}}}void main(){int a[N];a[1] = 1;MapMatchColor(a,2);}


这是算法结果:



原创粉丝点击