数据结构地图填色问题.docx

上传人:b****7 文档编号:9218560 上传时间:2023-02-03 格式:DOCX 页数:19 大小:101.65KB
下载 相关 举报
数据结构地图填色问题.docx_第1页
第1页 / 共19页
数据结构地图填色问题.docx_第2页
第2页 / 共19页
数据结构地图填色问题.docx_第3页
第3页 / 共19页
数据结构地图填色问题.docx_第4页
第4页 / 共19页
数据结构地图填色问题.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

数据结构地图填色问题.docx

《数据结构地图填色问题.docx》由会员分享,可在线阅读,更多相关《数据结构地图填色问题.docx(19页珍藏版)》请在冰豆网上搜索。

数据结构地图填色问题.docx

数据结构地图填色问题

《数据结构》实验报告

院系光电与信息工程学院专业电子信息工程

姓名学号电话

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;ivexnum;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;ivexnum;i++)//初始化邻接矩阵

for(j=0;jvexnum;j++)

G->acrs[i][j]=0;//都为0

for(k=0;kvexnum;k++)//构造行政区域邻接矩阵

{

New_Inputs:

printf("请输入与%c相邻的行政区域,已有相邻行政区域有:

",G->vexs[k]);

for(t=0;tvexnum;t++)//显示与Mg->vexs[k]已经相邻的行政区域

{

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(tvexnum)//输入与V1相邻的行政区域,存放于S数组中

{

scanf("%c",&s[t]);

if(s[0]=='\n')break;//没有的话就直接跳出

if(getchar()=='\n')break;

t++;

}

for(t=0;tvexnum;t++)//确定行政区域V1与其相邻的行政区域的关系,遍历数组S[]

{

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 营销活动策划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1