图的四色着色(C语言)
2017计算机学硕复试真题
用四种颜色给地图着色,要求相邻块颜色不同,图用邻接矩阵存储,求所有着色方案。
思路:
(草稿)
递归,如用下图,做出邻接矩阵:
map[N][N] = { 0,1,1,0,1,
1,0,1,0,1,
1,1,0,1,0,
0,0,1,0,1,
1,1,0,1,0 }
inputColor(int n,int *color,int col,int sign)是一个递归函数,其中
n表示给第n个点着色 ,col=1表示已经着色,col=0表示未着色 ,sign=0表示未验证,sign=1表示已验证且可行
有以下三种情况:col sign
0 0//未着色 ,则着色
1 0//已着色但未验证
1 1//着色且此色可用
故在函数中分三种情况判断:
1、if(col == 0) //未着色
那么将每一种颜色(颜色用1,2,3,4表示)赋给color[n],并调用递归inputColor(n,color,1,0) 去验证着此色是否可行
2、if(col==1 && sign==0) //已着色但未验证
那么验证此位用此色是否行得通,验证方法:在邻接矩阵中找到与此点相邻的点,若这些点的颜色不相邻,则
inputColor(n,color,1,1)//此色可用,sign置为1,若此色不可行,则不作处理,也就不会再有任何操作,也无法打印
3、if(col==1 && sign==1) //着色且此色可用
那么,判断一下此时的n是否是最后一位,若是最后一位即n==N-1,则表示所有位都成功赋予一个颜色,故打印输出
若n<N-1,则去进行处理下一位,inputColor(n+1,color,0,0),当然,下一位的col和sign都是0,回到第一种情况继续处理这一位。
=========================================================================
故如此递归,可以找出所有的着色方案。
代码如下:
#include<stdio.h>
#define N 5
int map[N][N] = {0,1,1,0,1,1,0,1,0,1,1,1,0,1,0,0,0,1,0,1,1,1,0,1,0};//五个点,七条边的图,邻接矩阵表示
int main(){void inputColor(int n,int *color,int col,int sign);int color[5]={0};inputColor(0,color,0,0);return 0;
}
/**给第n个点着色 ,col=1表示已经着色,col=0表示未着色 ,sign=0表示未验证,sign=1表示已验证且可行 **/
/*有以下三种情况:col sign0 0//未着色 ,则着色1 0//已着色但未验证1 1//着色且此色可用当n=N-1,即最后一位时,若此时col==1,sign==1,则可打印输出*/
void inputColor(int n,int *color,int col,int sign){int i;for(i=n+1;i<N;i++)//消除之前着色的痕迹color[i] = 0;if(col == 0){//未着色 ,则着色for(i=1;i<=4;i++){//颜色1-4color[n] = i;
// printf("测试:");
// for(int p = 0;p < N;p++)
// printf("%d\t",color[p]);
// printf("测试\n");inputColor(n,color,1,0);//验证着此色是否可行}}else if(col==1 && sign==0){//已着色但未验证 ,则验证此位for(i=0;i<N;i++)if(map[n][i]==1 && color[n]==color[i])return;inputColor(n,color,1,1);//此色可用,sign置为1}else if(col==1 && sign==1){//着色且此色可用if(n<N-1)//进行下一位inputColor(n+1,color,0,0);else if(n==N-1){//若此位是最后一位,则打印输出for(i=0;i<N;i++)printf("%d\t",color[i]);printf("\n");}}}
运行结果:
(部分展示)
全部展示:
1 2 3 1 3
1 2 3 1 4
1 2 3 2 3
1 2 3 2 4
1 2 3 4 3
1 2 4 1 3
1 2 4 1 4
1 2 4 2 3
1 2 4 2 4
1 2 4 3 4
1 3 2 1 2
1 3 2 1 4
1 3 2 3 2
1 3 2 3 4
1 3 2 4 2
1 3 4 1 2
1 3 4 1 4
1 3 4 2 4
1 3 4 3 2
1 3 4 3 4
1 4 2 1 2
1 4 2 1 3
1 4 2 3 2
1 4 2 4 2
1 4 2 4 3
1 4 3 1 2
1 4 3 1 3
1 4 3 2 3
1 4 3 4 2
1 4 3 4 3
2 1 3 1 3
2 1 3 1 4
2 1 3 2 3
2 1 3 2 4
2 1 3 4 3
2 1 4 1 3
2 1 4 1 4
2 1 4 2 3
2 1 4 2 4
2 1 4 3 4
2 3 1 2 1
2 3 1 2 4
2 3 1 3 1
2 3 1 3 4
2 3 1 4 1
2 3 4 1 4
2 3 4 2 1
2 3 4 2 4
2 3 4 3 1
2 3 4 3 4
2 4 1 2 1
2 4 1 2 3
2 4 1 3 1
2 4 1 4 1
2 4 1 4 3
2 4 3 1 3
2 4 3 2 1
2 4 3 2 3
2 4 3 4 1
2 4 3 4 3
3 1 2 1 2
3 1 2 1 4
3 1 2 3 2
3 1 2 3 4
3 1 2 4 2
3 1 4 1 2
3 1 4 1 4
3 1 4 2 4
3 1 4 3 2
3 1 4 3 4
3 2 1 2 1
3 2 1 2 4
3 2 1 3 1
3 2 1 3 4
3 2 1 4 1
3 2 4 1 4
3 2 4 2 1
3 2 4 2 4
3 2 4 3 1
3 2 4 3 4
3 4 1 2 1
3 4 1 3 1
3 4 1 3 2
3 4 1 4 1
3 4 1 4 2
3 4 2 1 2
3 4 2 3 1
3 4 2 3 2
3 4 2 4 1
3 4 2 4 2
4 1 2 1 2
4 1 2 1 3
4 1 2 3 2
4 1 2 4 2
4 1 2 4 3
4 1 3 1 2
4 1 3 1 3
4 1 3 2 3
4 1 3 4 2
4 1 3 4 3
4 2 1 2 1
4 2 1 2 3
4 2 1 3 1
4 2 1 4 1
4 2 1 4 3
4 2 3 1 3
4 2 3 2 1
4 2 3 2 3
4 2 3 4 1
4 2 3 4 3
4 3 1 2 1
4 3 1 3 1
4 3 1 3 2
4 3 1 4 1
4 3 1 4 2
4 3 2 1 2
4 3 2 3 1
4 3 2 3 2
4 3 2 4 1
4 3 2 4 2
Program ended with exit code: 0
随机挑选4种方案进行验证:
图的四色着色(C语言)相关推荐
- java 地图四色着色算法_趣味地图系列之6 四色定理之我见
四色定理(four color map theorem)是一个著名的数学定理[1],即对任意的(平面上的)地图染色,要求相邻的国家颜色不同,四种颜色即可完成着色. 南非数学家法兰西斯·古德里在1852 ...
- 四色着色问题 c语言编程,数据结构-图着色问题
7-38 图着色问题 (25 分) 图着色问题是一个著名的NP完全问题.给定无向图G=(V,E),问可否用K种颜色为V中的每一个顶点分配一种颜色,使得不会有两个相邻顶点具有同一种颜色? 但本题并不是要 ...
- java 地图四色着色算法_继陈景润之后周立敬攻破世界三大数学难题之一:地图四色难题...
地图四色问题又称四色猜想,与哥德巴赫猜想.费马猜想一起并称为为世界三大数学猜想.世界三大数学难题. 1965年5月,陈景润发表论文<大偶数表示一个素数及一个不超过2个素数的乘积之和>,最接 ...
- java 地图四色着色算法_四色定理的简单证明:从四色猜想到四域公理
摘要 "四色猜想"也称"四色定理",一直以来都没有一种简捷明快的证明方法,然而,本文认为"四色猜想"可以作为一个平面区域相邻关系的" ...
- 四色着色问题 c语言编程,四色问题C语言怎么解决
思路:建立数据结构,录入数据内容,遍历着色,输出第一个可行的着色方案. 下面就四个方面详细分析一下 首先分析数据结构: 对于地图,一个区块包含一个唯一编号数据(这个编号可以是地名,也可以是数字)用来区 ...
- 地图四色着图的C语言实现
四色问题又称四色猜想.四色定理,是世界三大数学猜想之一.四色定理是一个著名的数学定理,通俗的说法是:每个平面地图都可以只用四种颜色来染色,而且没有两个邻接的区域颜色相同.1976年借助电子计算机证明了 ...
- c语言电子地图程序,地图四色着图的C语言实现
四色问题又称四色猜想.四色定理,是世界三大数学猜想之一.四色定理是一个著名的数学定理,通俗的说法是:每个平面地图都可以只用四种颜色来染色,而且没有两个邻接的区域颜色相同.1976年借助电子计算机证明了 ...
- Python实现地图四色原理的遗传算法(GA)着色实现
1 任务需求 首先,我们来明确一下本文所需实现的需求. 现有一个由多个小图斑组成的矢量图层,如下图所示:我们需要找到一种由4种颜色组成的配色方案,对该矢量图层各图斑进行着色,使得各相邻小图斑间 ...
- 索骥馆-编程语言之《程序语言的奥妙:算法解读(四色全彩)》扫描版[PDF]
内容简介: 在我们生活的世界中,各种各样形形色色的事物和现象,其中都必定包含着科学的成分.在这些成分中,有些是你所熟知的,有些是你未知的,有些是你还一知半解的.面对未知的世界,好奇的你是不是有很多疑惑 ...
最新文章
- 计算机操作记录怎么删除,win7系统如何清除电脑使用记录
- 用CComPtr吧,COM接口指针很危险
- 配置修改Nginx支持 PATHINFO
- 2.2 LayoutInflater 加载布局文件源码
- FreeBSD下MongoDB数据库的安装
- log4j.xml按照日期生成_荐读 | 进项发票快速生成凭证!这个功能太方便了!
- 用setuna截图时自动放大_setuna截图软件下载
- python基于django的高校教师科研成果管理系统
- [混音插件]板岩混响效果器
- 东方通TongWeb部署应用中文件不下载而在页面打开
- HTTP协议格式详解(总结)
- oracle18c 配置,0报错!Oracle 18C 完全安装指南及常见问题汇总
- 麦克风测试软件 ios,iOS开发麦克风权限判断
- 【复杂网络建模】——Python可视化重要节点识别(PageRank算法)
- 华益血糖信息管理系统服务器,华益精点推出新一代智能血糖仪
- 【项目】danmu punish启动
- RTX SDK Refrence RTXSDK教程之入门篇
- angular之RXJS
- Typora自定义精美主题
- layuit 框架_layui前端框架