一、需求分析
1、问题描述
现在有一张地图,为了便于区别各个地图上的板块,地图上相邻的颜色块应该是不同的颜色。
现在的任务是给定一张地图,要对其进行着色,相邻的板块之间的颜色不能相同,输出最后的着色的方案。
2、基本分析
功能一:为了程序的灵活性,可以让程序自由建立图
功能二:为建好的图进行着色。
3、输入输出
输入一张图的信息,正确输入边数和顶点数,输入边的关系(两个顶点之间的),颜色只要四种,分别用数字1到4表示。
输出时根据每个顶点不同的标号输出着色的结果。
二、概要设计
1、设计思路
给定四种颜色,从选定的第一个顶点开始着色,先是第一种颜色,如果这个颜色与这个顶点的其他邻接顶点颜色不重
复,则这个顶点可以使用此颜色,程序开始对下一个顶点着色;如果着色重复,则使用下一种颜色重复上述过程。
着色过程就是一个递归的过程,直到所有的顶点都有着色后结束着色过程
结束
2、数据结构设计:
因为这个程序是对图的操作,所以程序采用的逻辑结构是图状,存储结构是邻接矩阵,考虑用邻接表是因为一般的地图的某一个顶点并不会与很多的顶点邻接,如果用邻接矩阵就能符合实际的需求,虽然占用稍大的空间,但是增强了程序的实际使用性。
抽象数据类型定义如下:
数据对象是点和边(vex&adj)
数据关系是颜色分布以及边的相邻的两个顶点
基本操作:
CreatGrouph(&G);
创建一张需要操作的无向图G
Destroy(Graph &G);
初始条件:无向图G存在
操作结果:销毁图G
LocateVex(&G,i)
初始条件:无向图G存在
操作结果:若在图G中存在顶点i,则返回该顶点在图中的位置,否则返回其他信息
Trycolor(current &G,store[])
初始条件:无向图G存在,在图中有第current个顶点
操作结果:对图开始遍历,并且用他们的序号在store数组的相应位置上存储所染上的颜色。
Print Graph(&G);
初始条件:无向图存在
操作结果:打印图G中的每个顶点的颜色
colorsame(test G)
初始条件:无向图G存在,test为图中的一个顶点
操作结果:如果图中的test的邻接点的颜色都不与test相同,则返回真,否则返回假。
3、软件结构设计
本程序分为两个模块
1、主程序模块
Int main()
{
建立一张图G
建立存储最终着色的结果的数组
对地图进行着色
打印地图着色情况
销毁图
退出
}
2、 无向图操作图模块---》无向图的中的节点赋值遍历
函数调用关系图
详细设计: colorsame
LocateVex
四、调试分析:
本程序的主要功能是建立一个图,然后对图进行着色,数据类型为整型,用不同的数字表示不同的颜色。
本程序的时间复杂度为
n^2。
运行测试:
五、体会与自我评价
本次题目是我选择的图操作的一个问题,设计到图的邻接顶点的访问和图的遍历。
图的存储结构我选择的是矩阵的形式,在遍历的时候是从第一条边开始,查询这边的两个顶点颜色是否相等,直至最后一条边,保证了所有顶点都不予相邻关系的顶点颜色相同,矩阵比邻接表更加直观,牺牲了部分效率。
此题目的设计思路并不难,大致只有两个方向,一是对点的遍历,另一个是对边的遍历,我认为此次题目的难度在于对图的输入部分的编写,很容易产生错误,用户的输入不规范就会产生错误的结果。