地图着色问题.docx
- 文档编号:23884926
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:10
- 大小:144.40KB
地图着色问题.docx
《地图着色问题.docx》由会员分享,可在线阅读,更多相关《地图着色问题.docx(10页珍藏版)》请在冰豆网上搜索。
地图着色问题
一、需求分析
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数组的相应位置上存储所染上的颜色。
PrintGraph(&G);
初始条件:
无向图存在
操作结果:
打印图G中的每个顶点的颜色
colorsame(testG)
初始条件:
无向图G存在,test为图中的一个顶点
操作结果:
如果图中的test的邻接点的颜色都不与test相同,则返回真,否则返回假。
3、软件结构设计
本程序分为两个模块
1、主程序模块
Intmain()
{
建立一张图G
建立存储最终着色的结果的数组
对地图进行着色
打印地图着色情况
销毁图
退出
}
2、无向图操作图模块---》无向图的中的节点赋值遍历
函数调用关系图
详细设计:
typedefstruct
{
vextypevexs[MAXedg];
adjtypearcs[MAXedg][MAXedg];
intvnum,arcnum;
}Graph;
用typedefstruct建立结构体Graph,包含点数组vexs与边数组arcs还有两者的数目
intLocateVex(GraphG,charu)
{
inti;
for(i=1;i { if(u==G.vexs[i]) returni; } if(i==G.vnum) { cout<<"Erroru"< exit (1); } return0; } 储存符合范式的点 voidCreateGraph(Graph&G) { inti,j,k,w; vextypev1,v2; cout<<"输入图的顶点数和变数"< cin>>G.vnum>>G.arcnum; cout<<"输入图的各顶点"< for(i=1;i<=G.vnum;i++) { cin>>G.vexs[i]; } for(i=0;i<=G.vnum;i++) for(j=0;j<=G.vnum;j++) { G.arcs[i][j]=MAX; } cout<<"输入边的两个顶点和权值"< for(k=0;k { cin>>v1>>v2>>w; i=locateVex(G,v1); j=locateVex(G,v2); G.arcs[j][i]=w; } 完成对图的初始化建立,输入点,边关系 voidPrintGraph(GraphG) { inti,j; cout<<"图的各个顶点"< for(i=1;i<=G.vnum;i++) { cout< } cout<<"图的邻接矩阵"< for(i=1;i<=G.vnum;j++) cout< } 打印图的邻接矩阵 intcolorsame(ints,GraphG) { inti,flag=0; for(i=1;i<=s-1;i++) if(G.arcs[i][s]==1&&color[i]==color[s]) { flag=1;break; } returnflag; } 判断是着色是否存在问题,对每条边进行遍历,相邻的两个点着色是否相等 voidoutput(GraphG) { inti; for(i=1;i<=G.vnum;i++) cout< } voidtrycolor(ints,GraphG) { inti; if(i>G.vnum) { output(G); exit (1); } else { for(i=1;i<=N;i++) { color[s]=i; if(colorsame(s,G)==0) trycolor(s+1,G); } } } 输出函数着色的方案 尝试给顶点着色,每次着色一个顶点,就遍历相邻关系的顶点一次,若不相同就使用这个颜色 intmain() { GraphG; CreateGraph(G); PrintGraph(G); cout<<"着色方案"< trycolor(1,G); return0; } 主函数main,调用其他函数完成地图着色过程 四、调试分析: 本程序的主要功能是建立一个图,然后对图进行着色,数据类型为整型,用不同的数字表示不同的颜色。 本程序的时间复杂度为n^2。 运行测试: 五、体会与自我评价 本次题目是我选择的图操作的一个问题,设计到图的邻接顶点的访问和图的遍历。 图的存储结构我选择的是矩阵的形式,在遍历的时候是从第一条边开始,查询这边的两个顶点颜色是否相等,直至最后一条边,保证了所有顶点都不予相邻关系的顶点颜色相同,矩阵比邻接表更加直观,牺牲了部分效率。 此题目的设计思路并不难,大致只有两个方向,一是对点的遍历,另一个是对边的遍历,我认为此次题目的难度在于对图的输入部分的编写,很容易产生错误,用户的输入不规范就会产生错误的结果。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 地图 着色 问题