地图着色课程设计

合集下载

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.平时表现:通过学生在课堂上的参与度、提问回答、小组讨论等表现,评估其对地图着色知识的掌握和应用能力。

c地图着色课程设计

c地图着色课程设计

c 地图着色 课程设计一、课程目标知识目标:1. 学生能够理解地图着色的基本概念和原则,掌握地图着色中常见的表示方法。

2. 学生能够运用不同的颜色和图案对地图进行合理的着色,准确表达各类地理信息。

3. 学生能够掌握地图着色在地理学习和生活中的实际应用。

技能目标:1. 学生能够运用地图着色技巧,提高地理空间思维能力。

2. 学生能够通过地图着色,培养观察、分析、解决问题的能力。

3. 学生能够运用地图着色方法,独立完成地理图表的制作。

情感态度价值观目标:1. 学生培养对地理学科的兴趣和热情,提高学习积极性。

2. 学生通过地图着色,增强对国家、地区、民族的认同感和归属感。

3. 学生养成合作、探究、创新的学习态度,提高团队协作能力。

课程性质:本课程以地图着色为主题,结合地理学科特点,注重培养学生的空间思维能力和实际操作能力。

学生特点:六年级学生具有较强的观察、分析和动手能力,对新鲜事物充满好奇,但注意力容易分散。

教学要求:教师应注重启发式教学,引导学生主动参与,关注个体差异,提高学生的实践操作能力。

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

二、教学内容本课程依据课程目标,结合地理学科要求,选择以下教学内容:1. 地图着色基础知识:介绍地图着色的定义、作用和分类,使学生了解地图着色在地理信息表达中的重要性。

- 教材章节:第二章 地图与地理信息- 内容列举:地图着色的基本概念、分类及其应用2. 地图着色原则与方法:讲解地图着色的原则,如相邻区域不同色、同类地理要素同色等,并介绍常用的地图着色方法。

- 教材章节:第二章 地图与地理信息- 内容列举:地图着色的原则、方法及其在实际中的应用3. 地图着色实践操作:指导学生运用地图着色技巧,对给定的地图进行合理着色,并分析地图着色在地理学习和生活中的实际应用。

- 教材章节:第二章 地图与地理信息,第三章 地理图表制作- 内容列举:地图着色的实践操作、地理图表制作技巧4. 地图着色案例分析:分析典型地图着色案例,使学生了解地图着色在地理信息表达中的优劣及改进方法。

高中数学地图填色教案

高中数学地图填色教案

高中数学地图填色教案教学内容:地图着色问题是一种经典的图论问题,通过这个问题可以引导学生理解和掌握基本的图论知识,提高学生的数学建模能力和解决问题的能力。

教学目标:1. 理解地图着色问题的基本概念和规则;2. 掌握地图填色的基本方法和技巧;3. 提高学生的数学逻辑思维能力和解决问题的能力。

教学重点:1. 地图填色问题的基本概念;2. 地图填色问题的基本方法;3. 地图填色问题的应用。

教学难点:1. 地图填色问题的数学建模;2. 地图填色问题的解决方法;3. 地图填色问题的实际应用。

教学准备:1. 教师准备PPT课件;2. 学生准备课本和笔记本。

教学步骤:一、导入(5分钟)通过展示一幅地图填色的示例,引导学生思考如何对地图进行正确的填色。

二、呈现(10分钟)介绍地图填色问题的基本概念和规则,提出一个简单的地图填色问题,让学生尝试解答。

三、讲解(15分钟)讲解地图填色问题的基本方法和技巧,向学生介绍常见的填色算法和应用场景,引导学生思考如何解决更复杂的地图填色问题。

四、练习(20分钟)让学生分组进行练习,通过多个地图填色问题的解答,巩固所学知识和技巧,培养学生的解决问题能力。

五、总结(5分钟)总结本节课的学习内容,强调地图填色问题的重要性和应用价值,激发学生对数学的兴趣和热情。

六、作业布置(5分钟)布置相关的课外作业,让学生在课下进一步巩固所学知识,提高解决问题的能力。

教学评价:通过本节课的学习,学生应能够掌握地图填色问题的基本概念和方法,提高数学建模能力和解决问题的能力,同时提高学生对数学的兴趣和热情。

地图着色课程设计

地图着色课程设计

算法分析与设计课程设计说明书地图着色学院:计算机与控制工程学院专业:计算机科学与技术学生姓名: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引言(或绪论)此次课程设计的要求是已知某地图(如中国地图),对各区域进行着色,要求相邻省所使用的颜色不同,并保证使用的颜色总数最少。

课程设计—一元多项式计算器--中国地图着色

课程设计—一元多项式计算器--中国地图着色

课程名称:指导教师:优秀:90分~100分良好:80分~89分中等:70~79分及格:60~69分不及格0分~59分武汉科技大学计算机科学与技术学院制表数据结构课程设计任务书【设计目的】数据结构是计算机专业的核心课程,是一门实践性很强的课程。

课程设计是加强学生实践能力的一个强有力手段,要求学生掌握数据结构的应用、算法的编写、类C语言的算法转换成C(C++)程序并上机调试的基本方法,还要求学生在完成程序设计的同时能够写出比较规范的设计报告。

严格实施课程设计这一环节,对于学生基本程序设计素养的培养和软件工作者工作作风的训练,将起到显著的促进作用。

【设计要求】1、课程设计题目共二题,每个学生必须独立完成;2、课程设计时间为1.5周;3、设计语言C(C++)不限;4、课余时间完成源程序和课程设计报告等文档书写工作,上机时间只能做调试工作。

5、上机任务1)选择合适的数据结构,并定义数据结构的结构体;2)根据程序所要完成的基本要求,设计出完整的算法;3)设计出主程序(main函数),使其成为完整的程序。

6、上机时间:上午8:20~11:50,下午2:10~5:407、无论在校外、校内,都要严格遵守学校和所在单位的学习和劳动纪律、规章制度,学生有事离校必须请假。

课程设计期间,无故缺席按旷课处理;缺席时间达四分之一以上者,其成绩按不及格处理。

特别说明:数据结构、算法、输入输出方式、其他功能均可自行设计,鼓励思路创新。

课程设计一:一元多项式计算器1)需求分析①设计一个一元多项式的计算器,功能包括(1)输入并建立多项式(一个多项式最多不超过20项),可以从文件中读取相关数据;(2)输出多项式,输出形式可以是图形方式,也可以是文本方式;(3)实现两个多项式相加,并输出和多项式;(4)实现两个多项式相减,并输出差多项式;(5)实现两个多项式相乘,并输出乘积多项式;(6)计算并输出多项式在指定x处的值。

②程序设计的任务:设计出一个一元多项式计算器,该计算器可以根据用户需求构建一元多项式并进行两个一元多项式之间的加、减和乘的运算,还可以根据用户指定的未知数的值计算单个一元多项式的值。

地图染色教案

地图染色教案

地图染色教案河山。

在出去玩之前都会先查看地图了解一下情况。

(出示:中国地图与河南地图)看,这是中国地图与河南省的地图。

要用几种颜色呢?这节课我们就来研究地图染色问题。

板书:地图染色市与开封市相邻,(出示两市地图),要给它们涂色,并要求相邻区域颜色不同,最少要用几种颜色?生:2种生:6种,因为商丘市有3种颜色可选,开封市有2种颜色可选,用3X2=6(种)里我们用乘法原理来计算共有多少种涂色方法既简单有方便。

市相邻(出示:三市地图)用A、B、C分别表示三个市区,要给它们涂色,使相邻的区域颜色不一样,至少要用多少种颜色?生:3种生:6种涂法,因为商丘市有3种颜色可选,那么开封市就有2种颜色可选了,而周口市就只有1种颜色可选。

所以3X2X1=6(种)板书:A——B——C3 X 2 X 1= 6(种)师:瞧,大拇指在向你点头微笑,它说你是最棒的!孩子们,从中你发现了什么?生:(1)、我发现A选3种颜色后,则后面的市区颜色的选择都比上一个少了一种颜色可选。

(2)、我发现都是用乘法算式计算师:大家观察的真仔细!老师也很仔细的观察了地图发现郑州、开封、商丘是这样的一种情况(出示:三市地图,用A、B、C分别表示郑州、开封、商丘)要给它们涂色,要求相邻的区域颜色不一样,那么至少要用几种颜色?生:3种师:有不同的想法吗?(如果有困难,能够引导:仔细观察三个城市的位置关系,要求相邻的区域颜色不一样,那么不相邻的呢?)生:2种师:说说你的想法生:A需要一种颜色,B与A相邻需要一种颜色,而C与B相邻与A 不相邻,所以C的颜色能够与A一样,这样就只需要2种颜色就能够了。

师:你表达的清晰流畅,真棒!这种位置关系只要2种颜色就能够了,不过老师想用红、黄、蓝三种颜色给他们涂色,要求相邻的两个区域颜色不一样,会有几种涂色方法?完成探究一:(自己独立完成,有困难时能够用彩色卡纸动手摆一摆,发现不同。

)师:谁愿意展示自己的成果呢?生:(1)、我认为有6种方法。

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

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

数据结构课程设计报告地图着色问题地图着色问题是一个经典的图论问题,涉及到如何用至少的颜色给地图上的各个区域进行着色,使得相邻的区域颜色不同。

在数据结构课程设计报告中,我们将详细介绍地图着色问题的定义、解决方法以及实现过程。

一、问题定义地图着色问题可以用图论的方式来描述。

给定一个地图,地图上的每一个区域可以看做图的一个顶点,而区域之间的邻接关系可以看做图的边。

问题的目标是找到一种着色方案,使得相邻的区域颜色不同,且使用的颜色数至少。

二、解决方法1. 贪心算法:贪心算法是一种简单而有效的解决地图着色问题的方法。

具体步骤如下:a. 选择一个未着色的区域。

b. 遍历该区域的所有邻接区域,记录已经使用的颜色。

c. 选择一个未使用的颜色,给该区域着色。

d. 重复步骤a-c,直到所有区域都被着色。

2. 回溯算法:回溯算法是一种穷举所有可能解的方法,通过逐步试错来找到最优解。

具体步骤如下:a. 选择一个未着色的区域。

b. 遍历所有可用的颜色,尝试给该区域着色。

c. 检查该区域与相邻区域的颜色是否冲突,如果冲突则回溯到上一步。

d. 重复步骤a-c,直到所有区域都被着色。

三、实现过程1. 数据结构设计:在解决地图着色问题时,我们可以使用图的邻接矩阵或者邻接表来表示地图的结构。

邻接矩阵适合于稠密图,而邻接表适合于稀疏图。

此外,我们还需要使用一个数组来记录每一个区域的颜色。

2. 算法实现:根据选择的解决方法,我们可以实现相应的算法来解决地图着色问题。

对于贪心算法,我们可以按照贪心的策略来选择颜色;对于回溯算法,我们可以使用递归来穷举所有可能的解。

3. 算法优化:地图着色问题属于NP彻底问题,因此在实际应用中,对于大规模的地图,穷举所有可能的解是不可行的。

我们可以通过一些优化策略来提高算法的效率,如剪枝、启示式搜索等。

四、实例分析假设我们有一个地图,包含5个区域,相邻区域如下所示:区域1:区域2、区域3区域2:区域1、区域3、区域4区域3:区域1、区域2、区域4、区域5区域4:区域2、区域3、区域5区域5:区域3、区域4我们可以使用贪心算法来解决这个问题。

数据结构课程设计报告-地图着色

数据结构课程设计报告-地图着色

数据结构课程设计报告题目:地图着色一、需求分析1.问题描述现在有一张地图,为了便于区别各个地图上的版块,地图上相邻的颜色块应该是不同颜色。

现在的任务是给定一张地图,要对其进行着色,相邻版块之间颜色不能相同,输出最后的着色方案。

2.基本功能:功能一:为了程序的灵活性,可以让程序自由建立图。

功能二:对建好的图进行着色。

3.输入输出输入一张图的信息,正数输入边数和顶点数,输入边的关系,输入边的关系就是输入一条边的两个顶点。

颜色只用四种,所以每个结点的颜色域值只能取1到4输出时根据每个顶点不同的标号输出着色的结果。

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

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

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

抽象数据类型图的定义如下:数据对象V:V是具有相同特性的数据元素的集合,成为顶点集。

数据关系R:R={VR}VR={(v,w)|v,w∈V,(v,w)表示v和w之间存在的路径}基本操作P:CreateGraph(&G)操作结果:创建一张需要操作的无向图GDestroy(Graph &G)初始条件:无向图G存在操作结果:销毁图GLocate(&G,i)初始条件:无向图G存在操作结果:若在图G中存在顶点i,则返回该顶点在图中的位置,否则返回其他信息Traverse(current, &G, store[])初始条件:无向图G存在,在图中有第current个顶点操作结果:对图开始遍历,并且用他们的序号在store数组的相应位置上存储所染上的颜色print(&G)初始条件:无向图G存在操纵结果:打印图G中每个顶点的颜色着色情况is_different(test, G )初始条件:无向图G存在,test为图中的一个顶点操作结果:如果图G中test的邻接顶点颜色都不与test相同,则返回真,否则返回假3.软件结构设计:本程序分为两个模块:1.主程序模块int main(){建立一张图G建立存储最终着色结果的数组对地图进行着色打印地图着色的情况销毁图退出}无向操作图模块 ---------- 无向图中结点的赋值,遍历三、详细设计#define MAX_NUM 30struct ArcNode{int data;ArcNode *arcnext;};typedef struct{int vexdata;Colour clo;ArcNode *firstnext;}VNode,Adjlist[MAX_NUM];typedef struct {Adjlist vexlist;int arcnum,vexnum;}Graph;图的基本操作:void CreateGraph(Graph& MyGraph)//创建一个要求的无向图int is_different(VNode test,Graph G )//如果结点test中的颜色和图G中和他相邻的结点颜色不同,返回TRUE,否则返回FALSE void Traverse(int current,Graph &G,int store[])//对图G进行遍历,并且将分配的颜色按他在邻接表中的位置赋值到store中相应的位置void Destroy(Graph &G)//销毁已经存在的无向图Gint Locate(Graph MyGraph,int signal)寻找无向图中顶点为i的结点,返回其位置以上重要函数的的伪码算法int is_different(VNode test,Graph G ){i=text.clofor(j=0;j<G.vexnum;j++){if(G.vexlist[j].clo=i)return FALSE;}return TRUE;}void Traverse(int current=1,Graph &G,int store[]) 主要函数其流程图如下:主要思想是遍历和递归void Destroy(Graph &G){for(i=0;i<G.vexnum;i++){ArcNode *p=G.vexlist[i].firstnext,*q;while(p){q=p->arcnext;free(p);p=q;}}}函数调用关系图:四、调试分析1.本程序的主要功能是自己建立一个图,然后对图进行着色,支持的数据类型是整形,用不同的数字表示不同的颜色。

高中数学地图涂色教案大全

高中数学地图涂色教案大全

高中数学地图涂色教案大全
一、教学目标:
1. 了解地图涂色方法及其数学原理
2. 掌握地图涂色的基本技巧
3. 提高学生逻辑推理和空间想象能力
二、教学内容:
1. 地图涂色的定义及原理
2. 地图涂色练习题
三、教学步骤:
1. 导入:教师向学生介绍地图涂色的原理及意义,引导学生对地图涂色问题进行探讨。

2. 讲解:教师讲解地图涂色的基本方法和技巧,例如四色定理、颜色连通性等概念。

3. 练习:让学生通过实际练习题来巩固所学知识,提高解题能力。

4. 总结:教师总结本节课的重点内容,强调解题方法及技巧。

5. 拓展:鼓励学生自主探究地图涂色问题的其他相关知识,并拓展应用领域。

四、教学重点:
1. 地图涂色的基本原理
2. 地图涂色的基本技巧
五、教学难点:
1. 地图涂色问题的解题思路
2. 地图涂色问题的应用技巧
六、教学评价:
1. 结合课堂练习和作业考察学生地图涂色问题的解题能力和思维逻辑能力。

2. 鼓励学生通过实践加深对地图涂色问题的理解和掌握。

七、延伸拓展:
1. 可以让学生尝试用不同的颜色方案对地图进行涂色,探索新的解题方法。

2. 可以引导学生研究地图涂色问题在实际生活中的应用,如地图着色问题在地理信息系统中的应用等。

c语言地图着色问题课程设计

c语言地图着色问题课程设计

c语言地图着色问题课程设计一、课程目标知识目标:1. 让学生掌握C语言中的基本数据结构与算法,特别是图的相关概念和应用。

2. 让学生理解地图着色问题的实质,即图的顶点着色问题,并掌握其与计算机科学中的其他问题的联系。

3. 让学生掌握利用C语言解决地图着色问题的算法设计,包括但不限于回溯法、贪心算法等。

技能目标:1. 培养学生运用C语言进行问题分析、算法设计和程序编写的能力。

2. 培养学生通过调试和优化程序来提高问题解决效率的技能。

3. 培养学生运用逻辑思维和数学方法解决实际问题的能力。

情感态度价值观目标:1. 培养学生对计算机科学的兴趣,特别是对算法和程序设计的热情。

2. 增强学生的团队合作意识,通过小组讨论和协作完成复杂问题的解决。

3. 引导学生认识到编程解决问题的实际意义,理解计算机技术在国家和社会发展中的重要作用。

课程性质分析:本课程设计属于高中信息技术课程中的编程模块,以C语言为载体,着重于算法思维和问题解决能力的培养。

学生特点分析:高中生在逻辑思维和抽象思维方面有较好的发展,能够理解较为复杂的问题和算法。

他们对新鲜事物充满好奇,但需要通过具体案例和实践活动来加深理解。

教学要求:1. 教学内容与课本紧密结合,注重理论与实践相结合。

2. 教学过程中要注重启发式教学,引导学生主动探索和思考。

3. 教学评价应关注学生在知识掌握、技能应用和情感态度方面的综合表现。

二、教学内容1. 图的基本概念:图的结构定义,图的分类(有向图与无向图,连通图与非连通图),图的表示方法(邻接矩阵和邻接表)。

2. 地图着色问题背景知识:介绍地图着色问题的实际意义,分析其与图论中的顶点着色问题的联系。

3. 算法原理:- 回溯法:介绍回溯法的基本思想,解决地图着色问题的应用。

- 贪心算法:讲述贪心算法的设计思路,及其在地图着色问题中的运用。

4. C语言实现:- 编写图的表示结构体和基本操作函数。

- 实现回溯法和贪心算法解决地图着色问题的C程序。

地图着色问题c语言课程设计

地图着色问题c语言课程设计

地图着色问题c语言课程设计一、课程目标知识目标:1. 理解地图着色问题的基本概念,掌握其数学模型及相关算法。

2. 掌握C语言中数组、循环、条件判断等基本语法结构,并能将其应用于解决地图着色问题。

3. 了解贪心算法、回溯算法等基本算法在地图着色问题中的应用。

技能目标:1. 能够运用C语言编写解决地图着色问题的程序,具备一定的编程实践能力。

2. 能够通过分析地图着色问题,设计合适的算法,培养问题解决和算法设计能力。

3. 能够运用所学知识解决类似地图着色问题的实际应用,具备一定的知识迁移能力。

情感态度价值观目标:1. 培养学生面对问题积极思考、主动探究的学习态度,增强自信心和自主学习能力。

2. 培养学生团队合作意识,学会在团队中沟通、协作、共同解决问题。

3. 激发学生对计算机科学的兴趣,认识计算机编程在解决实际问题中的价值。

课程性质:本课程为实践性较强的课程,以项目为导向,注重培养学生的编程实践能力和问题解决能力。

学生特点:学生具备一定的C语言基础,了解基本语法结构,但对算法设计和实际应用尚不熟悉。

教学要求:通过讲解、示范、实践等多种教学手段,使学生掌握地图着色问题的相关知识,培养其编程实践能力和问题解决能力。

同时,关注学生情感态度的培养,激发学习兴趣,提高自主学习能力。

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

二、教学内容1. 地图着色问题基础知识:- 图的基本概念和表示方法- 地图着色的数学模型- 地图着色问题的实际意义和应用2. C语言基础语法复习:- 数组的使用- 循环结构(for、while)- 条件判断(if、else)3. 算法设计与分析:- 贪心算法原理及在地图着色问题中的应用- 回溯算法原理及在地图着色问题中的应用- 算法复杂度分析4. 编程实践:- 使用C语言实现地图着色问题求解- 调试与优化程序- 团队合作完成项目任务5. 教学进度安排:- 第一周:地图着色问题基础知识、C语言语法复习- 第二周:贪心算法、回溯算法原理讲解及案例分析- 第三周:编程实践,团队协作完成地图着色问题求解- 第四周:项目展示、点评、总结教学内容参考教材相关章节,结合课程目标进行组织,保证教学内容科学性和系统性。

地图着色课程报告

地图着色课程报告

地图着色课程报告课程设计报告学院、系:专业名称:计算机科学与技术课程设计科目VC++程序课程设计学生姓名:指导教师:完成时间:2013年 12 月地图着色问题一、设计任务与目标地图上有不同国家(不同区域),每个国家都与其他一些国家邻接。

现要求对地图着色,使所有的国家与它的邻接的国家有不同的颜色。

通常由四种颜色就已足够。

区域邻接区域1 2 3 4 5 6 02 134 03 1 2456 04 1 2 3 6 05 1 36 06 1 3 4 5 0二、方案设计与论证(1)可采取试探的方法逐步逼近最后解,即按某种模式生成一个部分解,检查它是否合格。

如为合格,在扩展这个部分解向最后解逼近,否则为不合格,不管如何扩展这个部分解都不会得到最后解。

这时必须放弃已生成的部分解中的某些结果,“回朔”到先前的部分解,在生成一个部分解,直到获得最后解。

也可采用递归算法,第一部先到底,再逐渐返回来各个判断,直到找出一组解并输出。

(2)给定无向连通图G的邻接矩阵和m种不同的颜色。

用这些颜色为图G的各个定点这着色,每个顶点着一种颜色。

是否有一种颜色使G中的每条边的2个顶点着不同的颜色,使用if语句就能马上的判断出来。

这个问题是图的m可着色判定问题。

若一个图最少需要m种颜色才能使图中每条边连接的两个顶点着不同的颜色,则称这个数m为该图的色数。

求有一个图的色数m的问题称为图的m可着色优化问题。

(3)在算法Backtrack中,当t>n时,算法继续搜索,得到新的m着色方案,当前找到的可m着色方案数sum增1.三、程序框图或流程图,程序清单与调用关系四、全部源程序清单#include<iostream>class Color{friend int mColoring(int,int,int **); private:bool OK(int k);void Backtrack(int t);int n;//图的顶点数int m;//可用颜色数int **a;//图的邻接矩阵int *x;//当前的解long sum;//当前找到m种颜色的着色方案数public:Color();virtual ~Color();};bool Color::OK(int k)//检查颜色可用性{for(int j=1;j<=n;j++){if((a[k][j]==1)&&(x[j]==x[k]))return false;}return true;}void Color::Backtrack(int t){if(t>n){sum++;if(sum==1){for(int i=1;i<=n;i++){switch(x[i]){case 1:cout<<"第"<<i<<"区域着红色"<<endl;break;case 2:cout<<"第"<<i<<"区域着蓝色"<<endl;break;case 3:cout<<"第"<<i<<"区域着绿色"<<endl;break;case 4:cout<<"第"<<i<<"区域着黄色"<<endl;break;}}cout<<endl;}}else{for(int i=1;i<=m;i++){x[t]=i;if(OK(t))Backtrack(t+1);x[t]=0;}}}int mColoring(int n,int m,int **a) {Color X;//初始化XX.n=n;//数组维数X.m=m;//可用颜色数X.a=a;//矩阵X.sum=0;//方案总数int *p=new int[n+1];for(int i=0;i<=n;i++)p[i]=0;X.x=p;//存放解的数组X.Backtrack(1);delete []p;return X.sum;}#include<iostream>#include"olor.h"using namespace std;int main(){int **a;int i,j,b,c;cout<<"请输入邻接矩阵维数:"<<endl; cin>>b;cout<<endl;cout<<"请输入使用颜色数目:"<<endl; cin>>c;cout<<endl;a=new int *[b+1];for(i=1;i<=b;i++)a[i]=new int[b];cout<<"请输入邻接矩阵数据:"<<endl; for(i=1;i<=b;i++){for(j=1;j<=b;j++){cin>>a[i][j];}}cout<<"输入邻接矩阵的数据如下:"<<endl;for(i=1;i<=b;i++){for(j=1;j<=b;j++){cout<<a[i][j]<<" ";}cout<<endl;}cout<<"Test:"<<endl;int temp=mColoring(b,c,a);cout<<"其中不同的配色方案总共有"<<temp<<"种"<<endl;delete []a;cout<<"四色定理:任何一张地图只用四种颜色就能使具有共同边界的国家着上不同的颜色."<<endl;system("pause");return 0;}五、程序运行的测试与分析六、结论与心得通过这次的课程设计的作业,我学到了许多的以前没有知识。

  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,则表示已经成功着上颜色。

相关文档
最新文档