1、 / 地图行政区域填充的颜色存储数组long int Count=0; / 统计总共的填色方案个数2) 本程序主要包含 6 个函数 :主函数 main()显示行政区域的邻接矩阵关系 对地图行政区域进行第一次着色 对地图行政区域进行各种方案着色的显判断这个颜色对第 n 行政区域能不能满足要求 各函数间调用关系如下:Same_ColorMain( 3) 主函数的伪码main() 定义一个邻接矩阵 G; 创建地图及行政区域的邻接矩阵; 显示行政区域的邻接矩阵关系; 对地图进行填充颜色; 改变颜色,显示多种方案;五、 详细设计#define MAX_VERTEX_NUM 26 / 最大行政区域个数 t
2、ypedef struct / 邻接矩阵/* 函数: Create_Graph *功能:建立地图的邻接矩阵* 说明:输入参数 Graph *G 本函数很好的完成了地图的创建以及行政区域之间的存储。 在输入错误的时候,会有相应的指示,使得程序更加健壮。*/void Create_Graph( Graph *G ) / 建立地图行政区域的邻接矩阵 输入地图的行政区域的个数 G-vexnum ; 输入行政区域,构造行政区域 -顶点向量 ; 初始化邻接矩阵都为 0;构造行政区域邻接矩阵; 输入与 V1 相邻的行政区域,存放于 S 数组中; 相邻的行政区域 G-acrsij=1 ; /* * 函数: P
3、rintf_Graph *功能:显示地图行政区域的邻接矩阵 * 说明:输入参数 Graph G 。本函数很好的完成了地图行政区域的邻接矩阵的显示 */ void Printf_Graph( Graph G )构造图形; 横向显示 行政区域; 纵向显示 行政区域; 显示邻接矩阵;/* * 函数: Same_Color*功能:判断这个颜色对第 n 行政区域能不能满足要求 *说明:输入参数 Graph G,int n ,输出 0 则表示满足,输出 1 则表示不满足int Same_Color(Graph G,int n)Colorn 分别与前面已经着色的几块比较; 相邻并且颜色一样,则不满足; 颜色
4、满足 返回 0 颜色不满足 返回 1 Load_Color* 功能:对地图行政区域进行第一次着色 ,始之满足要求*说明:输入参数 Graph G ,int n void Load_Color( Graph G , int n )取一种颜色If( 颜色满足,没有与前面冲突 ) 下一块行政区域着色 Load_Color(G ,n+1);Else 尝试另一种颜色 Print_Color对地图行政区域进行各种方案的显示。 *说明:输入参数 Graph G ,int m 注意:调用本函数的前提是 Color 数组中有一个正确的填充颜色的方案。void Print_Color( Graph G , int
5、 m)for(i=1;i=4;i+) 更换颜色,新的颜色不与前面冲突,颜色满足 下一个行政区域 Print_Color( G , m+1 ) ; 直到(到最后一个行政区域 ,递归出口) 遍历数组 Color ,显示所有行政区域颜色,新的方案;主函数Void main()定义一个邻接矩阵 G;六、 测试结果七、 参考文献数据结构八、 附录#include math.hstdlib.hstring.h/* 数据结构期末综合实验 */题目:地图填色问题 #define MAX_VERTEX_NUM 26 / 最大行政区域个数 / 邻接矩阵数据类型的定义 / 行政区域 -顶点向量 int acrsMA
6、X_VERTEX_NUMMAX_VERTEX_NUM; / 邻接矩阵 int vexnum; / 地图当前行政区域个数 Graph ; Create_Graphvoid Create_Graph( Graph *G )int i , j , k , t ;char sMAX_VERTEX_NUM;char tempMAX_VERTEX_NUM;char V1 , V2 ;/ 建立地图行政区域的邻接矩阵/ 变量的定义/ 暂时存放与某一行政区域相邻的行政区域/ 临时数组/ 相邻的两个行政区域的顶点向量Start:G-vexnum =0;printf( 输入地图的行政区域的个数/ 初始化,总的行政区
7、域个数为(不超过 26 个 ):t);scanf(%d,&vexnum);gets(temp);if( G-vexnum vexnum 27) goto Start;/ 输入的数值不在 026 之间重新开始for(i=0;vexnum;i+)New_Input:for(t=0;tvexs iz|G-vexs i0) / 输入的不为单字符,重新输入 输入的不为单字符,重新输入 ni;t+) / 检测当前输入的行政区域与之前有没有冲突, 有冲突, 重新输 入vexs i=G-vexs t) 输入的行政区域之前已经输入过,重新输入 n/初始化邻接矩阵for(j=0;jj+)acrsij=0 ;都为
8、0for(k=0;kvexsk); for(t=0;vexnum ;t+) / 显示与 Mg-vexsk 已经相邻的行政区域 acrskt=1) printf(%c ,G-vexst);printf(nV1=G-vexsk; / V1 行政区域i=k; / 确定 v1 在 G-vexs 中的位置 为 i/ 清空 S 数组/ 输入与 V1 相邻的行政区域,存放于 S 数组中t+) st=NULL;t=0;while(tacrsji=1;void Printf_Graph( Graph G )int i , j ; 地图的邻接矩阵表示,相邻的用 1表示 n ); G .vexnum ;i+) pr
9、intf( ,G.vexs i);G .vexnum*4+3 ;-/ 构造图形/ 横向显示 行政区域/ 显示相应长度的 -%c / 纵向显示 行政区域G.vexnum ;%d ,G.acrsij); / 显示邻接矩阵/ / int ColorMAX_VERTEX_NUM+1; / 地图行政区域填充的颜色存储数组 long int Count=0; / 统计总共的填色方案个数 /*判断这个颜色对第 n 行政区域能不能满足要求int i ;n;i+) / 分别与前面已经着色的几块比较if(G.acrs ni=1&Colori=Colorn)/ 相邻并且颜色一样,则不满足return 1; / 与前
10、面颜色有冲突,返回 1,表示该颜色不满足 return 0; / 没有冲突,该颜色满足,返回 0*函数:Load_Color对地图行政区域进行第一次着色,始之满足要求输入参数 Graph G ,int nvoid Load_Color( Graph G , int n ) / 递归出口if(n=G.vexnum )elseColorn=i;if(Same_Color(G ,n)=0)Load_Color(G ,n+1); break;/ 存储颜色/ 颜色满足,没有与前面冲突/ 下一块行政区域 Print_Color *功能:void Print_Color( Graph G , int m)
11、int i=0, j=0;i+) Colorm=i;if(Same_Color(G,m)=0)if(m=G.vexnum -1)j+) switch(Colorj)/ 尝试更换颜色/ 新的颜色不与前面冲突,颜色满足/ 到最后一个行政区域 ,递归出口/ 遍历数组 Color ,显示所有行政区域颜色,新的方案!case 1:%c 区域填红色 , ,G.vexs j);break;case 2:%c 区域填黄色 , case 3:%c 区域填蓝色 , case 4:%c 区域填绿色 , Count+;/ 方案加 1Print_Color( G , m+1 ) ; / 下一个行政区域void main()Graph G;Create_Graph( &G);Printf_Graph( G ); 着色方案: nLoad_Color( G , 0 );Print_Color( G , 0 );n 总填充方案 %d 个 n,Count);/ 定义一个邻接矩阵 G/ 创建地图及行政区域的邻接矩阵/ 显示行政区域的邻接矩阵关系/ 着色方案/ 对地图进行填充颜色/ 改变颜色,显示多种方案
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1