地图着色课程设计

合集下载

C语言地图着色

C语言地图着色

课程设计地图着色课程设计名称:课程设计专业班级:学生姓名:学号:指导教师:课程设计时间:计算机专业课程设计任务书目录1 需求分析 (4)2 概要设计 (4)3详细设计 (5)4 运行环境 (6)5开发环境 (6)6 程序设计.............................................................................................6~97 调试分析........................................................................................9~108 测试结果 (10)9参考文献 (11)10心得体会 (11)11成绩评价表 (12)a) 1需求分析A 已知中国地图,对各省进行着色,要求相邻省所使用的颜色不同,并保证使用的颜色总数最少;B 将各省进行编号,然后利用无向图个顶点之间的边来表示各省的相邻关系;C 演示程序以用户和计算机的对话方式进行;D 最后对结果做出简单分析。

b ) 2概要设计:i 画程序整体结构图ii 分配函数功能功能模块的划分及模块间调用关系typedef struct //定义图{vextype vexs[MAXedg]; //存放边的矩阵adjtype arcs[MAXedg][MAXedg]; //图的邻接矩阵int vnum,arcnum; //图的顶点数和边数}Graph;C) 3详细设计i ) 主要功能模块的算法思想及其步骤着色模块:int colorsame(int s,Graph G)//判断这个颜色能不能满足要求{int i,flag=0;for(i=1;i<=s-1;i++)//分别与前面已经着色的几块比较if(G.arcs[i][s]==1&&color[i]==color[s]){flag=1;break;}return flag;void output(Graph G)//输出函数{int i;for(i=1;i<=G.vnum;i++)printf("%d ",color[i]);printf("\n");}void trycolor(int s,Graph G)//s为开始图色的顶点{int i;if(s>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);//进行下一块的着色}}}d) 4 运行环境i 软件环境操作系统:Windows8ii 硬件环境处理器:Intel Pentium 166MX内存:32MB硬盘空间:1GB显卡:SVGAE) 5 开发环境I 编程环境:Dev-C++ 5.0 beta 9.2 (4.9.9.2)Ii 编程语言:C语言,ANSI C89。

数据结构课程设计地图着色问题

数据结构课程设计地图着色问题

课程设计报告课程设计题目:地图着色问题专业:xxxxxxxxx班级:xxxxxxxxx姓名:xxxxxxxxx一:需求分析:1)已知中国地图,对各省进行着色,要求相邻省所使用的颜色不同,并保证使用的颜色总数最少;2)将各省进行编号,然后利用无向图个顶点之间的边来表示各省的相邻关系;3)演示程序以用户和计算机的对话方式进行;4)最后对结果做出简单分析。

二:概要设计一:设计思路把34个省看成34个顶点,从选定的第一个顶点开始着色,先试第一种颜色,如果这个颜色与这个顶点的其他邻接顶点的颜色不重复,则这个顶点就是用这种颜色,程序开始对下一个顶点着色;如果着色重复,则使用下一种颜色重复上面的操作。

着色过程就是一个递归的过程,直到所有的顶点都处理完后结束着色。

二:数据结构设计因为这个程序是对图的操作,所以程序采用的逻辑结构是图状,存储结构选用邻接表,考虑用邻接表是因为一般的地图的某一个顶点并不会与很多的顶点相邻接,如果用邻接矩阵会浪费很多的存储空间,所以我选择的邻接表来存储。

其中:typedef struct ArcNode{int x; (表示与当前顶点所表示省份相邻的省份的位置信息)struct ArcNode *next; (指向下一个弧结点)}ArcNode; (表示省份之间相邻关系的弧结点)typedef struct{char *name; (顶点所表示的省份的名称)int color; (省份的颜色,用数字表示不同的颜色)ArcNode *firstnext; (指向第一个弧)}shengfen[35];三:详细设计该程序一共包含三个模版:分别为初始化模版、着色模版和输出模版。

1.初始化模块声明表示省份的顶点信息、省份之间相邻关系的弧的信息,并为其赋值。

2.着色模块为各个省份着色。

for(i=1;i<=34;i++){sheng[i].color=0;}for(i=1;i<=34;i++){j=1;p=sheng[i].firstnext;while(p!=NULL){while(p!=NULL&&j!=sheng[p->x].color){p=p->next;}if(p!=NULL)j++;}sheng[i].color=j;}3.输出模块输出各个省份的颜色信息。

地图着色问题课程设计

地图着色问题课程设计

地图着色问题课程设计一、课程目标知识目标:1. 理解地图着色问题的基本概念,掌握地图着色中涉及到的图论知识;2. 学会运用不同的算法解决地图着色问题,了解其优缺点;3. 掌握地图着色问题在实际生活中的应用,如行政区划、交通规划等。

技能目标:1. 能够运用所学知识,对给定的地图进行有效着色,提高解决问题的能力;2. 学会运用图论软件或工具进行地图着色的实际操作,培养动手实践能力;3. 通过团队合作,培养学生的沟通协调能力和解决问题的能力。

情感态度价值观目标:1. 激发学生对图论和地图着色问题的兴趣,培养良好的学习态度;2. 引导学生关注地图着色问题在实际生活中的应用,提高学生的社会责任感和实践意识;3. 培养学生面对复杂问题时,保持积极的心态,勇于克服困难,寻求解决问题的方法。

课程性质:本课程为数学学科选修课程,结合图论知识,以地图着色问题为载体,培养学生的逻辑思维能力和实际操作能力。

学生特点:学生处于高年级阶段,具备一定的数学基础和逻辑思维能力,对新鲜事物充满好奇心,具备一定的团队协作能力。

教学要求:注重理论与实践相结合,充分调动学生的积极性,引导学生主动参与课堂讨论和实践活动,提高学生的综合素养。

在教学过程中,将课程目标分解为具体的学习成果,以便于教学设计和评估。

二、教学内容1. 图论基础知识回顾:包括图的定义、图的表示方法、顶点和边的性质等;教材章节:第一章 图的基本概念2. 地图着色问题的提出:介绍地图着色的背景、意义及应用场景;教材章节:第二章 图的着色问题3. 地图着色算法:学习并掌握贪心算法、回溯算法、遗传算法等地图着色方法;教材章节:第三章 着色问题的算法及其应用4. 地图着色问题的实际操作:运用图论软件或工具进行地图着色实践;教材章节:第四章 着色问题的实际应用5. 地图着色问题案例分析:分析生活中的地图着色问题实例,如行政区划、交通规划等;教材章节:第五章 着色问题的案例分析6. 团队合作与交流:分组讨论、分享学习心得,培养学生的团队协作和沟通能力。

高中数学地图涂色题教案

高中数学地图涂色题教案

高中数学地图涂色题教案
一、教学目标:
1. 知识与技能:学习地图涂色题的解题方法,掌握地图着色定理的应用。

2. 过程与方法:培养学生观察、思考和解决问题的能力。

3. 情感态度与价值观:培养学生对数学问题的兴趣,激发学生学习的动力。

二、教学重难点:
1. 着色问题的理解和应用;
2. 地图涂色题的解题方法。

三、教学准备:
1. 教师备好课本、黑板、粉笔等教学工具;
2. 准备足够多的地图涂色题例题。

四、教学过程:
1. 引入:通过一个简单的例题引入地图涂色题,引导学生思考问题所在。

2. 概念讲解:介绍地图涂色问题中的着色定理,解释着色定理的含义和应用。

3. 练习:让学生针对具体的地图涂色题进行练习,帮助他们熟练掌握解题方法。

4. 拓展:引导学生自主拓展地图涂色题的解题思路,提高他们的解题能力。

5. 知识巩固:带领学生回顾本节课的重要知识点,巩固所学知识。

6. 作业布置:布置相关的练习题作为课后作业,巩固学生对地图涂色题的理解和应用。

五、教学反思:
通过教学中学生的反馈和表现,及时调整教学策略,帮助学生更好地掌握地图涂色题的解题方法,提高他们的学习效果。

同时,教师也要不断反思自己的教学方法,不断提升教学水平,使学生获益更多。

实验报告_ 地图着色

实验报告_ 地图着色

课程设计地图的四色问题班级: 07计单组长:陈轶群组员:吕龙任课教师:鞠训光一、需求分析1.以二维数组list[N+1][N+1]表示地图,N表示区域数目,数组中以元素值为0表示不邻接,1表示邻接,限定区域数目N<=50.2.用户先输入区域数目N,再输入邻接区域的代码,邻接可只写一次,区域的代码为0~N,N个为区域,一个为外部区域,或输入N-1,则可不包括外部区域,N个区域由用户定义3.输出时,采用一一对应的方法,一个区域对应一种颜色形式:区域代码==》颜色代码(1~4)=》颜色4.本程序可为任意一张的地图染色,并且至多只染四种颜色5.测试数据:当区域数目N=8,地图如下:输出为 0=>1=>red1=>2=>green2=>3=>blue3=>4=>yellow4=>1=>red5=>2=>green6=>2=>green7=>4=>yellow8=>3=>blue6.程序执行的命令为:1)创建地图 2)存储地图 3)获取地图 4)地图着色 5)退出二、概要设计1.设定地图的抽象数据类型为:ADT list{数据对象:D={ai,j|ai,jε{’0’、‘1’},0 <=i<=N,0<=j<=N数据关系:R={ROW,COL}ROW={<ai-1,j,ai,j>|ai-1,j,ai,jεD,i=1,…N,j=0,…,N}COL={<ai,j-1,ai,j>|ai,j-1,ai,jεD,i=0,…N,j=1,…,N}}2.本程序包括两个模块1)主程序模块:void main(){初始化;while{接受命令;处理命令;}}2)地图模块――实现地图抽象数据类型各模块之间的调用关系如下:主程序模块地图模块三、详细设计1.地图数据类型的操作设置如下:int creat(int N,int list[][MAX+1])//初始化并创建地图的邻接矩阵2.两点是否邻接的伪码算法:int link(int x,int *dc,int n,int list[][MAX+1]){//从1到n看是否与x相邻,是返回‘1’// 否则,返回‘0’for(i=0;i<n;i++)if(list[dc[i]][x])return(1);return(0);}3.着色伪码算法int *fco(int *color,int N,int list[][MAX+1]){//遇到一个区域,给它最小的颜色,看他是否与该种颜色的区域邻接,是则另赋//颜色,否则找下个区域,如果还不能着色,则前面区域另设颜色,直到成功初始化颜色for(i=0;i<N+1;i++){为第一个区域着色;for(k=0;k<4;k++){如果第k种颜色还未有地区,则将其赋予第i个区域;否则,看他是否与第k种颜色的地区相邻if(!link(i,dc[k],mcd[k],list)){dc[k][mcd[k]]=i;color[i]=k+1;mcd[k]=mcd[k]+1;break;}}if(color[i]==0)i=reset(i,color,mcd,dc,list);}}}4.将邻接矩阵存储伪码算法int save(int N,int list[][MAX+1]){//将邻接矩阵存成文件}5.主程序和其他函数的伪码算法void main{//主程序while(1){//系统初始化,主界面clrscr();//清屏显示清单ReadCommand(cmd); //读入一个操作命令符Interpret(cmd) ; //执行操作}}6.函数调用关系图反映了演示程序的层次结构1.Crea t2.save3.load4.fco5.exitlink四、调试分析1.首先使用了《离散数学》的解决方法,但在测试中国地图中出错,因为排序并不能解决递归调用的问题,后来省掉了排序,在使用开始那个例子时,第8个区域不能着色,因此,改采用递归的方法2.算法的时间复杂度为O(N),空间复杂度为O(N*N);3.通过本次试验,我认识到采用递归方法比较快捷,实现方便五、程序代码#include<graphics.h>#define MAX 50int total;int lin[MAX][MAX];int color[MAX];void draw();int okcyq(int dep,int i,int x){int k;for(k=x;k<=dep;k++){if(lin[dep][k]==1 && i==color[k])return(0);if(!okcyq(dep,i,k+1)&&k==dep)return(1);}return(0);}void output(){int k;for(k=1;k<=total;k++)printf("%d ",color[k]);}void find(int dep){int i;for(i=1;i<=4;i++){if(okcyq(dep,i,1)){color[dep]=i;if(dep==total) {output();getch();draw();exit(1);}else find(dep+1);color[dep]=0;}}}void draw(){int gdriver,gmode;int x=1,y=1,dx,dy,dx2,dy2,i=1;char dot,draw;gdriver=DETECT;initgraph(&gdriver,&gmode,"");cleardevice();setbkcolor(BLACK);while((dot=getch())!='q'){line(1,440,639,440);switch(dot){case 'a':setviewport(1,441,639,479,BLUE);clearviewport();outtextxy(1,2,"Press 'b' to end, then Press 'q' to quit");setviewport(1,1,639,439,BLUE);moveto(x,y);while((draw=getch())!='b'){switch(draw){case77:x=(getx()+1)%639;y=gety();moveto(x,y);putpixel(x,y,RED);break;case75:x=getx()-1;y=gety();moveto(x,y);putpixel(x,y,RED);break;case72:x=getx();y=gety()-1;moveto(x,y);putpixel(x,y,RED);break;case80:x=getx();y=(gety()+1)%439;moveto(x,y);putpixel(x,y,RED);break;}}break;default:setviewport(1,441,639,479,BLUE);clearviewport();outtextxy(1,2,"Press 'e' to end, then Press 'q' to quit");setviewport(1,1,639,439,BLUE);while((draw=getch())!='e'){switch(draw){case77:x=(getx()+1)%639;y=gety();putpixel(getx(),gety(),getpixel(x,y) );moveto(x,y);putpixel(x,y,YELLOW);break;case75:x=getx()-1;if(x==0)x=639;y=gety();putpixel(getx(),gety(),getpi xel(x,y));moveto(x,y);putpixel(x,y,YELLOW);break;case72:x=getx();y=gety()-1;if(y==0)y=439;putpixel(getx(),gety(),getpi xel(x,y));moveto(x,y);putpixel(x,y,YELLOW);break;case80:x=getx();y=(gety()+1)%439;putpixel(getx(),gety(),getpixel(x,y) );moveto(x,y);putpixel(x,y,YELLOW);break;}}}}setviewport(1,441,639,479,BLUE);clearviewport();outtextxy(1,2,"Press 'e' to end, then Press 'q' to quit");setviewport(1,1,639,439,BLUE);moveto(x,y);while((dot=getch())!='q'){switch(dot){case77:x=(getx()+1)%639;y=gety();putpixel(getx(),gety(),getpixel(x,y) );moveto(x,y);putpixel(x,y,YELLOW);break;case75:x=getx()-1;if(x==0)x=639;y=gety();putpixel(getx(),gety(),getpi xel(x,y));moveto(x,y);putpixel(x,y,YELLOW);break;case72:x=getx();y=gety()-1;if(y==0)y=439;putpixel(getx(),gety(),getpi xel(x,y));moveto(x,y);putpixel(x,y,YELLOW);break;case80:x=getx();y=(gety()+1)%439;putpixel(getx(),gety(),getpixel(x,y) );moveto(x,y);putpixel(x,y,YELLOW);break;case 13:dx=x;dy=y;{if(getpixel(dx,dy)!=RED)dx--;else break;}dx2=dx;dx=x;while(1){if(getpixel(dx,dy)!=RED)dx++;else break;}setcolor(color[i]);line(dx2+1,dy,dx-1,dy);dx=x;while(1){if(getpixel(dx,dy)!=RED)dy--;else break;}dy2=dy;dy=y;while(1){if(getpixel(dx,dy)!=RED)dy++;else break;}setcolor(color[i]);line(dx,dy2+1,dx,dy-1);break;case 'k':i++;}}closegraph();}void main(){int i,j,sp,ep;char c;clrscr();printf("The amount of district:");scanf("%d",&total);for(i=0;i<=total;i++)for(j=0;j<=total;j++)lin[i][j]=0;for(i=0;;i++){clrscr();printf("The start point:");scanf("%d",&sp);printf("The end point:");scanf("%d",&ep);lin[sp][ep]=1;lin[ep][sp]=1;printf("\nPress 'q' return to main...\n");c=getch();if(c=='q')break;}for(i=0;i<=total;i++)for(j=0;j<=total;j++){printf("%d ",lin[i][j]);if(j==total)printf("\n");}getch();for(i=0;i<=total;i++) color[i]=0;clrscr();find(1);}五、用户使用说明1.本程序的运行环境为Dos操作系统,执行文件为:no4.exe2.进入演示程序后,即显示文本方式的用户界面3.进入“创建地图”,即提示输入地区的数目,该命令后输入地图的数据4.进入save可把输入文件名,地图存储起来5.进入load 可输入文件名,把地图打印出来6.进入draw the color of graph,将地图进行染色六、测试结果1.输入地区数目为31 2 2 3 0 1 0 2 0 3输出0=〉1=〉red 1=>2=>green 2=>3=>blue 3=>2=>green七、附录着色后的中国地图。

地图着色课程设计

地图着色课程设计
数据结构课程设计
题目地图着色问题
姓名杨康林伟胜
学号13091012 1309101209
年级09级
专业信息与计算科学
指导教师熊保平
年月日
题目:地图着色
一、需求分析:
1.已知中国地图,对各省进行着色,要求相邻省所使用的颜色不同,并保证使用的颜色总数最少;
2.将各省进行编号,然后利用无向图个顶点之间的边来表示各省的相邻关系;
<>
<>
100
0
N 4着色的颜色数
[30]={0}来存储对应块的对应颜色
;
;
定义图
{
[];存放边的矩阵
[][];图的邻接矩阵
;图的顶点数和边数
};
***********************************************************
( u)
{
i;
(1<)
{
([i])
i;
这次的课程设计使我们懂得了理论与实际相结合是非常重要的,只有理论知识是远远不够的。在整个设计过程中,构思是很花费时间的。调试时也经常遇到这样那样的错误,马虎或者知识不够而不懂得设计,用错了方法。在这过程中我们发现了很多我们自己的不足和知识的漏洞。
通过这次的课程设计之旅,使我们收益匪浅,这也是我们以后人生中的一次宝贵的经验吧。
顶点为:a b c d e f
相邻边:
五课程设计总结
经过一个星期的课程设计,过程曲折可谓一言难尽。整天都是对着电脑,不然就是翻阅资料。在此期间我们失落过,也曾一度热情高涨。点点滴滴令我回味无穷。这次课程设计使我体会到只有做到细心耐心,恒心才能做好事情。
这次的课程设计加强了我们动手,思考和解决问题的能力,巩固和加深了对数据结构的理解,提高综合运用本课程所学知识的能力,培养了我们选用参考书,查阅手册以及文献资料的能力,培养独立思考,深入研究,分析问题,解决问题的能力。

数据结构课设之地图着色

数据结构课设之地图着色

课程设计(论文)任务书软件学院学院软件+电气专业2011— 3 班一、课程设计(论文)题目地图着色问题二、课程设计(论文)工作自2012 年 12 月 29 日起至 2013 年 1 月 6 日止三、课程设计(论文) 地点: 科技楼机房四、课程设计(论文)内容要求:1.本课程设计的目的⑴训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题;⑵初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;⑶提高综合运用所学的理论知识和方法独立分析和解决问题的能力,巩固、深化学生的理论知识,提升编程水平。

2.课程设计的任务及要求1)基本要求:⑴要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、编写上机程序和上机调试等若干步骤完成题目,最终写出完整的报告;⑵在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率;⑶程序设计语言推荐使用C/C++,程序书写规范,源程序需加必要的注释;⑷每位同学需提交可独立运行的程序和规范的课程设计报告。

2)课程设计论文编写要求⑴理论设计部分以课程设计论文的形式提交,格式必须按照课程设计论文标准格式进行书写和装订;⑵课程设计报告(论文)包括中文目录、设计任务、需求分析、概要设计、详细设计、编码实现、调试分析、课设总结、谢辞、参考文献、附录等;⑶设计部分应包含系统功能模块图,调试分析应包括运行截图等。

3)课程设计评分标准:⑴学习态度:10分;⑵系统设计:20分;⑶编程调试:20分;⑷回答问题:20分;⑸论文撰写:30分。

4)参考文献:⑴严蔚敏,吴伟民. 数据结构(C语言版)[M]. 清华大学出版社. 2010.3⑵严蔚敏,吴伟民. 数据结构题集(C语言版)[M]. 清华大学出版社. 1999.2⑶何钦铭,冯燕等. 数据结构课程设计[M]. 浙江大学出版社. 2007.85)课程设计进度安排⑴准备阶段(4学时):选择设计题目、了解设计目的要求、查阅相关资料;⑵程序模块设计分析阶段(4学时):程序概要设计、详细设计;⑶代码编写调试阶段(8学时):程序模块代码编写、调试、测试;⑷撰写论文阶段(4学时):总结课程设计任务和设计内容,撰写课程设计论文。

c地图着色课程设计

c地图着色课程设计

c 地图着色课程设计一、教学目标本课程的目标是让学生掌握地图着色的基本概念和方法,能够运用所学的知识独立完成地图的着色任务。

具体的教学目标如下:知识目标:学生能够理解地图着色的概念、意义和应用;掌握地图着色的基本原则和方法。

技能目标:学生能够熟练运用地图着色工具,独立完成地图的着色任务;能够分析地图着色的效果,提出改进意见。

情感态度价值观目标:学生能够认识到地图着色在地理学和实际生活中的重要性,培养对地图着色的兴趣和热情。

二、教学内容本课程的教学内容主要包括地图着色的概念、原则和方法。

具体的教学内容如下:1.地图着色的概念:介绍地图着色的定义、意义和作用,让学生了解地图着色在地理学和相关领域中的应用。

2.地图着色的原则:讲解地图着色的基本原则,如区域性原则、渐变性原则、突出性原则等,让学生掌握地图着色的基本规律。

3.地图着色的方法:介绍常见的地图着色方法,如单一色系着色、渐变色系着色、符号着色等,让学生学会如何进行地图着色。

三、教学方法为了达到本课程的教学目标,我们将采用以下教学方法:1.讲授法:通过讲解地图着色的概念、原则和方法,让学生掌握地图着色的基本知识。

2.案例分析法:通过分析典型的地图着色案例,让学生学会如何运用地图着色方法解决实际问题。

3.实验法:让学生亲自动手进行地图着色实验,培养学生的动手能力和实际操作技能。

四、教学资源为了支持本课程的教学内容和教学方法的实施,我们将准备以下教学资源:1.教材:选择适合本课程的教材,为学生提供系统的地图着色知识。

2.参考书:提供相关的参考书籍,为学生提供更多的学习资料。

3.多媒体资料:制作课件、视频等多媒体资料,为学生提供直观的学习体验。

4.实验设备:准备地图着色的实验设备,如地图、着色工具等,为学生提供实际操作的机会。

五、教学评估为了全面、客观地评估学生在地图着色课程中的学习成果,我们将采用以下评估方式:1.平时表现:通过学生在课堂上的参与度、提问回答、小组讨论等表现,评估其对地图着色知识的掌握和应用能力。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

算法分析与设计课程设计说明书地图着色学院:计算机与控制工程学院专业:计算机科学与技术学生姓名:xxxxx学号:成绩学生姓名:xxxxx 学号:成绩指导教师:内容提要此题为地图着色问题,由地图着色问题很容易想到图的着色问题,因此可以把地图抽象为无向图来解决地图的着色问题。

对地图的抽象相当于对图的抽象,即以邻接矩阵来实现地图的区域相邻的描绘,而对地图的区域数即以图的顶点数来描绘。

设计说明书的内容包括需求分析,概要设计,详细设计,代码实现,后期测试等内容,需求分析是对此问题所需要实现的功能的介绍,概要设计是对所需要实现功能的模块划分,以及初步的实现思想,详细设计通过编写大致的代码来实现功能,代码实现则是具体的解决问题,解决此问题设计了两个算法,贪心,回溯,在程序的测试阶段,回溯算法对同一个问题的解决速率高于贪心算法,但是结果都是以最少的颜色数来染色。

课题实现的环境是在window环境下的eclipse中,通过在其中输入地图的区域数,图的连接情况,来选择相应的算法来实现染色,本次课题所采用的数据结构主要是二维数组来抽象图的邻接矩阵。

目录1引言(或绪论) (1)2需求分析 (2)2.1 问题分析 (2)2.3问题解决 (2)2.3 运行环境及开发工具 (3)2.4功能需求 (3)2.4.1 地图的抽象及输入 (3)2.4.2 地图着色的算法设计 (3)2.4.3 界面设计 (3)2.4.4 输出设计 (3)2.5任务分配 (4)3概要设计 (4)3.1 数据定义 (4)3.2 功能模块定义 (4)3.2.1 地图的抽象输入模块 (4)3.2.2 输出模块 (4)3.2.3 地图染色模块 (4)3.2.4 界面设计模块 (5)3.2.5 主模块 (5)3.3 程序流程图 (6)4 详细设计 (7)4.1 地图输入模块 (7)4.1.1 数据类型 (7)4.1.2 具体实现 (7)4.2 界面设计模块 (7)4.2.1 数据类型 (7)4.2.2 具体实现 (7)4.3 算法设计模块 (9)4.3.1 回溯法过程 (9)4.3.2 贪心法过程 (10)5 程序设计模块 (11)5.1 界面设计代码 (11)5.2 染色实现模块 (15)6 程序测试 (19)6.1 运行结果 (19)6.2 贪心、回溯着色结果及分析 (19)7 算法时间、空间复杂度分析 (22)7.1 递归回溯 (22)7.2 贪心算法 (22)8 课设总结…………………………………………………………………………2 2 8.1 已实现功能及不足 (22)8.2 心得体会 (22)参考文献 (24)1引言(或绪论)此次课程设计的要求是已知某地图(如中国地图),对各区域进行着色,要求相邻省所使用的颜色不同,并保证使用的颜色总数最少。

此问题就是经典的地图着色问题,地图着色问题与四色定理是紧密相关的。

地图着色问题与著名四色定理:那么可以用四种颜色来给这些区域染色,使得每两个邻接区域染的颜色都不一不会有两个邻接的区域颜色相同。

这就是著名的四色定理,由四色定理可以想到只需要四种颜色就可以为一个区域的地图着上颜色,而且相邻区域的颜色不相同。

2 需求分析2.1 问题分析:地图着色问题是一个抽象的图形学问题,用程序实现对各个区域进行着色,并且相邻省所用的颜色不同,同时保证颜色的总数最少,那么就是如何将这些抽象的进行数据化。

如何将程序所需要的功能模拟着色在计算机中编程实现。

2.2 问题解决:计算机中,图主要可以用两种方法表示:邻接矩阵和邻接链表。

N个顶点的邻接矩阵是一个N*N的布尔矩阵,图中的每一个顶点都由一行或者一列来表示,如果从第i个顶点和第j个顶点之间有边连接,则矩阵第i行,第j列的元素等于1,如果没有边连接,则等于0.这就是图的邻接矩阵表示那么地图也可以抽象为一个图,其可以用邻接矩阵来进行模拟:对于每一个地图,我们可以把每一个区〔区域或国家) 看作一个点,而区与区之间的邻接关系看作点与点之间的连线。

从而将地图抽象为一个图,然后就可以用邻接矩阵抽象。

如下图:其邻接矩阵为:A B C D EA 0 1 1 0 0B 1 0 1 1 1C 1 1 0 0 1D 0 1 0 0 1E 0 1 1 1 12.3运行环境及开发工具:运行环境:windows系统开发工具:eclipse编程工具2.4 功能需求:2.4.1:地图的抽象及输入:给定一个地图,要求画出绘制出其图的形式,并在计算机上用邻接矩阵实现。

相应的顶点为0,则表示两点邻接,否则,就不邻接,为1.2.4.2:地图着色的算法设计:回溯法:本题可采用回溯法进行着色。

当t=1时,对当前第t个顶点开始着色:若t>n,则已求得一个解,输出着色方案即可。

否则,依次对顶点t着色1-m,若t与所有其它相邻顶点无颜色冲突,则继续为下一顶点着色;否则,回溯,测试上一颜色。

回溯法的主要就是选择各种颜色,直到把此点着完色为止。

贪心法:选择一种颜色,以任意顶点作为开始顶点,依次考察图中的未被着色的每个顶点,如果一个顶点可以用颜色1着色,换言之,该顶点的邻接点都还未被着色,则用颜色1为该顶点着色,当没有顶点能以这种颜色着色时,选择颜色2和一个未被着色的顶点作为开始顶点,用第二种颜色为尽可能多的顶点着色,如果还有未着色的顶点,则选取颜色3并为尽可能多的顶点着色,依此类推,直到所有顶点都着上颜色。

贪心法就是选择一种颜色,最大化的将图中的各点都用这种颜色着上。

2.4.3:界面设计:地图着色的软件界面设计,选择何种算法,以及选择几种颜色来为相应的地图桌上颜色。

2.4.4:输出设计按要求输出动态的着色过程以及最终的染色结果,同时输出最终的着色结果,以及最少颜色数,在输出框里面输出。

2.5 任务分配:xxx:贪心法算法设计,界面设计xxx:回溯法算法设计3概要设计3.1 数据定义:int c[n+1][n+1]:邻接矩阵的中的数据只为0.1int color [n+1]:存取对对应的点的颜色,颜色用1,2,3,4表示int n:定义对应的点数int N 着色的颜色数3.2功能模块定义:3.2.1 地图的抽象输入模块:按操作者要求输入相应地图对应图的点数,以及相应点与其他点的连接情况,此输入在界面输入,其中点数表示某个区域的地区数,而连接情况表示各区域的相邻情况,用此来抽象地图。

3.2.2 输出模块:按操作者输入的数据,执行相应的算法,并且在界面上显示出来最终的结果,输出的有图的邻接矩阵,着色方案,还有图的着色的最少颜色数。

3.2.3 地图的染色模块:利用贪心算法以及回溯算法来为地图进行着色,即判断相应的点应该着那种颜色。

回溯法算法过程:设数组color[n+1]表示各顶点的着色情况,其中n表示相应的点数,回溯法:1.将数组color[n]初始化为0;2.s=1;3.while (s<=n)3.1 依次考察每一种颜色,若顶点s的着色与其他顶点的着色不发生冲突,则转步骤3.2;否则,搜索下一个颜色;3.2 若顶点已全部着色,则输出数组color[n+1],以及数组color[n+1]返回;3.3 否则,3.3.1 若顶点s是一个合法着色,则s=s+1,转步骤3处理下一个顶点;3.3.2 否则,重置顶点k的着色情况,换第二种颜色给顶点k着色,转步骤3。

主要函数:hscolor()贪心法算法过程:设数组color[n+1]表示各顶点的着色情况,算法如下:1.m=0,sum=0; //m着色的最少颜色数,sum已经着色的顶点数顶点12.while(sum<n)3.m=m+14. for (i=1; i<=n; i++)5.寻找可以着颜色1的第一个点,找到就终止此循环6.for (i=2; i<=n; i++)7.循环用颜色m为尽量多的未着色顶点着色,7.1 如果判断的点能着颜色m,则color[i]=m,sum++7.2 如果判断的点不能着此颜色,则找寻下一个能着此颜色得点8.跳回第三步,直到sum>=n5.输出color[n],已经最少的颜色数主要函数:txcolor3.2.4 界面设计模块:按题目要求在界面上输入地图的区域数,各区域的连接情况以及选择何种算法来进行着色。

结果输出在结果框。

3.2.5 主模块:利用以上设计的各个模块来进行调用,其中要选择相应的算法(回溯,贪心)来实现着色,从而完成地图着色,并且直观的结果在屏幕上显示出来。

3.3 程序流程图4 详细设计4.1 地图输入模块4.1.1数据类型:int n;顶点数int c[n+1][n+1]; 邻接矩阵String[] data;地图中各点的邻接连接情况,用0.1表示4.1.2 具体实现:n = textField.getText();//将定义的textField中的数据给nString[] data = textArea1.getText().split(" ");//将textArea1中的0.1数组给datafor (int i = 1; i < n+1; i++)for (int j = 1; j < n+1; j++)Array_1.c[i][j] = data[(i-1)*Array_1.n+j-1] //将data一维数组赋值给c二维数组4.2 界面设计模块4.2.1 数据类型public JTextField textField = new JTextField();public JTextArea textArea1 = new JTextArea();//设置文本域public Jbutton button;//设置按钮public static JTextArea textArea3 = new JTextArea();//文本域private JLabel label_1;//输入文本标签private JPanel contentPane;//整个界面4.2.2 具体实现*******************************设计主面板**************************setTitle("图的着色");//设置名字setBounds(100, 100, 604, 380); //设置大小contentPane = new JPanel();setContentPane(contentPane);contentPane.setBackground(Color.GREEN); //设置颜色*******************************设计结束*********************************************************文本域1************************** JLabel label = new JLabel("请输入地图的区域数");label.setFont(new Font("微软雅黑", Font.BOLD, 15));label.setBounds(23, 10, 166, 34);contentPane.add(label);textField.setBounds(23, 42, 192, 34);textField.setText("5");//设置初始值contentPane.add(textField);textField.setColumns(10);*******************************设计结束*********************************************************文本域2**************************label_1 = new JLabel("请输入各区域连接情况");label_1.setFont(new Font("微软雅黑", Font.BOLD, 13));label_1.setBounds(23, 86, 166, 30);contentPane.add(label_1);JScrollPane scrollPane = new JScrollPane();scrollPane.setBounds(23, 125, 192, 147);contentPane.add(scrollPane);textArea1.setText("0 1 1 0 0 1 0 1 1 1 1 1 0 0 1 0 1 0 0 1 0 1 1 1 1");//设置文本域二的初始值scrollPane.setViewportView(textArea1);*******************************设计结束*********************************************************按钮设计************************** JButton button = new JButton("贪心法");button.setFont(new Font("微软雅黑", Font.BOLD, 14));button.setBounds(23, 282, 92, 34);button.addActionListener(new MyEvent());contentPane.add(button);JButton button = new JButton("回溯法");//设置按钮名字button.addActionListener(new MyEvent());button.setFont(new Font("微软雅黑", Font.BOLD, 14));button.setBounds(140, 282, 92, 34);contentPane.add(button);*******************************设计结束*********************************************************结果文本域************************** JLabel label = new JLabel("染色结果");label.setFont(new Font("微软雅黑", Font.BOLD, 15));label.setBounds(369, 20, 84, 15);contentPane.add(label);JScrollPane scrollPane = new JScrollPane();scrollPane.setBounds(248, 42, 321, 273);contentPane.add(scrollPane);scrollPane.setViewportView(textArea3);*******************************设计结束************************** 4.3 算法设计模块4.3.1 回溯法主要代码int i;int N=4;//设计颜色数为4,但是并不是用这么多颜色,程序最终的结果是最优的,即输出来的颜色数肯定最少,因为四色定理 if(s>n)//递归出口,递归的最终出口{output();//输出结果}else{for(i=1;i<=N;i++)//对每一种色彩逐个测试{color[s]=i;if(colorsame(s)==0){//当测试这个颜色i=1为某个点着色不合格时,用第二种颜色着色,i=2进行判断,合格进行递归调用,不合格就使用第三种颜色,即i=3trycolor(s+1);//进行下一块的着色break;//停止回溯,因为已经着色成功}}}4.3.2 贪心法主要代码while(sum< n){//最终的判定条件,即将所有点着色完毕 m++;//第一次循环,m=1,m即为颜色数for(int i=1;i<=n;i++){//此循环用来查找第一个为着色的并且可以着色m的点if(color[i]==0){j=i;//j=1color[j]=m;sum++;break;//结束当前循环}}for(int i=j+1;i<=n;i++){//i=2if(color[i]!=0) continue;//color[i]的起始值为零,false,不执行continue,表示没有着色,因此执行下一步,否则起始值不为0,则表示已经成功着上颜色。

相关文档
最新文档