数据结构地图填色问题.docx
- 文档编号:7219288
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:13
- 大小:118.82KB
数据结构地图填色问题.docx
《数据结构地图填色问题.docx》由会员分享,可在线阅读,更多相关《数据结构地图填色问题.docx(13页珍藏版)》请在冰豆网上搜索。
数据结构地图填色问题
数据结构》实验报告院系光电与信息工程学院专业电子信息工程姓名学号电话
2011级2班2013年5月22日
二、问题描述
1976年。
美国科学家APPEL和HAKEN利用计算机证明了:
对一张地图,可以用不超过4种颜色对其填色,
使得相邻的区域填上不同的颜色。
要求输入一张行政区地图,用4种颜色对其填色,要求相邻的行政区域内没有相
同的颜色,给出所有的填色方案,并统计方案个数。
三、数据描述
首先考虑如何存储行政区域图,由于邻接矩阵能更好地描述各行政区之间的关系,所以采用邻接矩阵G来存储地图。
G[I,J]=1表示I,J两个行政区域相邻,为0表示不相邻
可采用二维数组来表示邻接矩阵G;另外设一数组COLOR[I]记录各行政区域所填颜色,分别取值为{1(红色),
2(黄色),3(蓝色),4(绿色)};数据描述如下:
INTG[N][N];
INTCOLOR[N+1];
四、概要设计
1)全局变量定义
#defineMAX_VERTEX_NUM26//最大行政区域个数
//邻接矩阵数据类型的定义
typedefstruct
{
charvexs[MAX_VERTEX_NUM];//行政区域-顶点向量
intacrs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵
intvexnum;//地图当前行政区域个数
}Graph;
intColor[MAX_VERTEX_NUM+1];//地图行政区域填充的颜色存储数组
longintCount=0;//统计总共的填色方案个数
2)本程序主要包含6个函数:
主函数main()
显示行政区域的邻接矩阵关系对地图行政区域进行第一次着色对地图行政区域进行各种方案着色的显
判断这个颜色对第n行政区域能不能满足要求各函数间调用关系如下:
Same_Color
Main
Same_Color
(3)主函数的伪码
main()
{定义一个邻接矩阵G;创建地图及行政区域的邻接矩阵;显示行政区域的邻接矩阵关系;对地图进行填充颜色;改变颜色,显示多种方案;
}
五、详细设计
//邻接矩阵数据类型的定义
#defineMAX_VERTEX_NUM26//最大行政区域个数typedefstruct
{
charvexs[MAX_VERTEX_NUM];//行政区域-顶点向量
intacrs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵
intvexnum;//地图当前行政区域个数
}Graph;
/****************************************************************************************
*函数:
Create_Graph*功能:
建立地图的邻接矩阵
*说明:
输入参数Graph*G本函数很好的完成了地图的创建以及行政区域之间的存储。
在输入错误的时候,会有相应的指示,使得程序更加健壮。
****************************************************************************************/
voidCreate_Graph(Graph*G)//建立地图行政区域的邻接矩阵{
输入地图的行政区域的个数G->vexnum;输入行政区域,构造行政区域-顶点向量;初始化邻接矩阵都为0;
构造行政区域邻接矩阵;
{输入与V1相邻的行政区域,存放于S数组中;相邻的行政区域G->acrs[i][j]=1;
}}/*****************************************************************************************函数:
Printf_Graph*功能:
显示地图行政区域的邻接矩阵*说明:
输入参数GraphG。
本函数很好的完成了地图行政区域的邻接矩阵的显示****************************************************************************************/voidPrintf_Graph(GraphG)
{
构造图形;横向显示行政区域;纵向显示行政区域;显示邻接矩阵;
}
/*****************************************************************************************函数:
Same_Color
*功能:
判断这个颜色对第n行政区域能不能满足要求*说明:
输入参数GraphG,intn,
输出0则表示满足,输出1则表示不满足
intSame_Color(GraphG,intn)
{
Color[n]分别与前面已经着色的几块比较;相邻并且颜色一样,则不满足;颜色满足返回0颜色不满足返回1
}
/****************************************************************************************
*函数:
Load_Color
*功能:
对地图行政区域进行第一次着色,始之满足要求
*说明:
输入参数GraphG,intnvoidLoad_Color(GraphG,intn)
{
取一种颜色
If(颜色满足,没有与前面冲突)下一块行政区域着色Load_Color(G,n+1);
Else尝试另一种颜色}
*函数:
Print_Color
*功能:
对地图行政区域进行各种方案的显示。
*说明:
输入参数GraphG,intm注意:
调用本函数的前提是Color[]数组中有一个正确的填充颜色的方案。
voidPrint_Color(GraphG,intm)
{
for(i=1;i<=4;i++)更换颜色,新的颜色不与前面冲突,颜色满足
{下一个行政区域Print_Color(G,m+1);直到(到最后一个行政区域,递归出口)
{遍历数组Color[],显示所有行政区域颜色,新的方案;
}
}
}
主函数
Voidmain()
{
定义一个邻接矩阵G;创建地图及行政区域的邻接矩阵;显示行政区域的邻接矩阵关系;对地图进行填充颜色;改变颜色,显示多种方案;
}
六、测试结果
七、参考文献
《数据结构》
八、附录
#include
#include
#include
#include
/*数据结构期末综合实验*/
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//题目:
地图填色问题~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#defineMAX_VERTEX_NUM26//最大行政区域个数//邻接矩阵数据类型的定义
typedefstruct
{
charvexs[MAX_VERTEX_NUM];//行政区域-顶点向量intacrs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵intvexnum;//地图当前行政区域个数}Graph;
/****************************************************************************************
*函数:
Create_Graph
*功能:
建立地图的邻接矩阵
*说明:
输入参数Graph*G本函数很好的完成了地图的创建以及行政区域之间的存储。
在输入错误的时候,会有相应的指示,使得程序更加健壮。
voidCreate_Graph(Graph*G)
{
inti,j,k,t;
chars[MAX_VERTEX_NUM];
chartemp[MAX_VERTEX_NUM];
charV1,V2;
//建立地图行政区域的邻接矩阵
//变量的定义
//暂时存放与某一行政区域相邻的行政区域
//临时数组
//相邻的两个行政区域的顶点向量
Start:
G->vexnum=0;
printf("输入地图的行政区域的个数
//初始化,总的行政区域个数为
(不超过26个):
\t");
scanf("%d",&G->vexnum);
gets(temp);
if(G->vexnum<1||G->vexnum>27)gotoStart;
//输入的数值不在0~26之间重新开始
for(i=0;i
{
New_Input:
for(t=0;t //构造行政区域-顶点向量 //清空temp数组 temp[t]=NULL; printf("请输入第%d个行政区域(用a~z单字符表示): ",i+1); scanf("%c",&G->vexs[i]);gets(temp); if(G->vexs[i]>'z'||G->vexs[i]<'a') {//输入的单字符不符合,重新输入 printf("输入的单字符不符合,重新输入\n"); gotoNew_Input; } if(strlen(temp)>0)//输入的不为单字符,重新输入 { printf("输入的不为单字符,重新输入\n"); gotoNew_Input; } for(t=0;t { if(G->vexs[i]==G->vexs[t]) { printf("输入的行政区域之前已经输入过,重新输入\n"); gotoNew_Input; } } } for(i=0;i // 初始化邻接矩阵 for(j=0;j G->acrs[i][j]=0; // 都为0 for(k=0;k // 构造行政区域邻接矩阵 { New_Inputs: printf("请输入与%c相邻的行政区域,已有相邻行政区域有: ",G->vexs[k]);for(t=0;t if(G->acrs[k][t]==1)printf("%c",G->vexs[t]); }printf("\n"); V1=G->vexs[k];//V1行政区域 i=k;//确定v1在G->vexs中的位置为i //清空S数组 //输入与V1相邻的行政区域,存放于S数组中 for(t=0;t t=0; while(t G->acrs[i][j]=G->acrs[j][i]=1; voidPrintf_Graph(GraphG) { inti,j; printf("地图的邻接矩阵表示,相邻的用1表示\n"); printf("|"); for(i=0;i printf("\n"); for(i=0;i //构造图形 //横向显示行政区域 //显示相应长度的- printf("\n"); for(i=0;i { printf("%c|",G.vexs[i]);//纵向显示行政区域 for(j=0;j { printf("%d",G.acrs[i][j]);//显示邻接矩阵 } printf("\n"); } } // //intColor[MAX_VERTEX_NUM+1];//地图行政区域填充的颜色存储数组longintCount=0;//统计总共的填色方案个数/**************************************************************************************** *函数: Same_Color *功能: 判断这个颜色对第n行政区域能不能满足要求 *说明: 输入参数GraphG,intn, 输出0则表示满足,输出1则表示不满足 intSame_Color(GraphG,intn) { inti; for(i=0;i if(G.acrs[n][i]==1&&Color[i]==Color[n])//相邻并且颜色一样,则不满足 { return1;//与前面颜色有冲突,返回1,表示该颜色不满足} return0;//没有冲突,该颜色满足,返回0 } *函数: Load_Color *功能: 对地图行政区域进行第一 次着色 ,始之满足要求 *说明: 输入参数GraphG, intn voidLoad_Color(GraphG,intn){ //递归出口 inti; if(n>=G.vexnum) { printf("\n"); }else { for(i=1;i<=4;i++) { Color[n]=i; if(Same_Color(G,n)==0) { Load_Color(G,n+1);break; } } } //存储颜色 //颜色满足,没有与前面冲突 //下一块行政区域 /**************************************************************************************** *函数: Print_Color*功能: 对地图行政区域进行各种方案的显示。 *说明: 输入参数GraphG,intm注意: 调用本函数的前提是Color[]数组中有一个正确的填充颜色的方案。 voidPrint_Color(GraphG,intm){ inti=0,j=0; for(i=1;i<=4;i++){ Color[m]=i; if(Same_Color(G,m)==0) { if(m==G.vexnum-1) { for(j=0;j switch(Color[j]) //尝试更换颜色 //新的颜色不与前面冲突,颜色满足 //到最后一个行政区域,递归出口 //遍历数组Color[],显示所有行政区域颜色,新的方案! { case1: printf("%c区域填红色,",G.vexs[j]);break; case2: printf("%c区域填黄色,",G.vexs[j]);break; case3: printf("%c区域填蓝色,",G.vexs[j]);break;case4: printf("%c区域填绿色,",G.vexs[j]);break; printf("\n"); Count++; //方案加1 }else { Print_Color(G,m+1);//下一个行政区域 } 主函数 voidmain() { GraphG; Create_Graph(&G); Printf_Graph(G); printf("着色方案: \n"); Load_Color(G,0); Print_Color(G,0); printf("\n总填充方案%d个\n",Count); //定义一个邻接矩阵G //创建地图及行政区域的邻接矩阵 //显示行政区域的邻接矩阵关系 //着色方案 //对地图进行填充颜色 //改变颜色,显示多种方案
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 地图 问题