数据结构地图填色问题.docx
- 文档编号:9218560
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:19
- 大小:101.65KB
数据结构地图填色问题.docx
《数据结构地图填色问题.docx》由会员分享,可在线阅读,更多相关《数据结构地图填色问题.docx(19页珍藏版)》请在冰豆网上搜索。
数据结构地图填色问题
《数据结构》实验报告
院系光电与信息工程学院专业电子信息工程
姓名学号电话
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()
•创建地图及行政区域的邻接矩阵Create_Graph()
•显示行政区域的邻接矩阵关系Printf_Graph()
•对地图行政区域进行第一次着色Load_Color()
•对地图行政区域进行各种方案着色的显Print_Color()
•判断这个颜色对第n行政区域能不能满足要求Same_Color()
Create_Graph
各函数间调用关系如下:
Printf_Graph
Main()
Load_Color
Same_Color
Print_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,intn
****************************************************************************************/
voidLoad_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;//初始化,总的行政区域个数为0
printf("输入地图的行政区域的个数(不超过26个):
\t");
scanf("%d",&G->vexnum);
gets(temp);
if(G->vexnum<1||G->vexnum>27)//输入的数值不在0~26之间重新开始
gotoStart;
for(i=0;i
{
New_Input:
for(t=0;t 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 for(t=0;t s[t]=NULL; t=0; while(t { scanf("%c",&s[t]); if(s[0]=='\n')break;//没有的话就直接跳出 if(getchar()=='\n')break; t++; } for(t=0;t { if(s[t]! =NULL&&s[t]! ='\n') { V2=s[t];//V2行政区域 for(j=0;G->vexs[j]! =V2;j++);//确定v2在G中的位置为j if(j>G->vexnum)//输入的元素不正确则显示错误,要求重新输入 { printf("输入有误,请重新输入\n"); gotoNew_Inputs; } if(V1! =V2)//输入的相邻行政区域与本身不相同 G->acrs[i][j]=G->acrs[j][i]=1; //置《v1,v2》的对称弧《v2,v1》 } } } } /**************************************************************************************** *函数: Printf_Graph *功能: 显示地图行政区域的邻接矩阵 *说明: 输入参数GraphG。 本函数很好的完成了地图行政区域的邻接矩阵的显示 ****************************************************************************************/ voidPrintf_Graph(GraphG) { inti,j; printf("地图的邻接矩阵表示,相邻的用1表示\n"); printf("|");//构造图形 for(i=0;i printf("%c",G.vexs[i]); printf("\n"); for(i=0;i printf("-"); 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]) { 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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 地图 问题