数据结构地图填色问题Word格式.docx
- 文档编号:22354651
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:19
- 大小:101.65KB
数据结构地图填色问题Word格式.docx
《数据结构地图填色问题Word格式.docx》由会员分享,可在线阅读,更多相关《数据结构地图填色问题Word格式.docx(19页珍藏版)》请在冰豆网上搜索。
//地图行政区域填充的颜色存储数组
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//最大行政区域个数
//行政区域-顶点向量
//邻接矩阵
//地图当前行政区域个数
/****************************************************************************************
*函数:
*功能:
建立地图的邻接矩阵
*说明:
输入参数Graph*G
本函数很好的完成了地图的创建以及行政区域之间的存储。
在输入错误的时候,会有相应的指示,使得程序更加健壮。
****************************************************************************************/
voidCreate_Graph(Graph*G)//建立地图行政区域的邻接矩阵
输入地图的行政区域的个数G->
vexnum;
输入行政区域,构造行政区域-顶点向量;
初始化邻接矩阵都为0;
构造行政区域邻接矩阵;
{
输入与V1相邻的行政区域,存放于S数组中;
相邻的行政区域G->
acrs[i][j]=1;
}
显示地图行政区域的邻接矩阵
输入参数GraphG。
本函数很好的完成了地图行政区域的邻接矩阵的显示
voidPrintf_Graph(GraphG)
构造图形;
横向显示行政区域;
纵向显示行政区域;
显示邻接矩阵;
判断这个颜色对第n行政区域能不能满足要求
输入参数GraphG,intn,
输出0则表示满足,输出1则表示不满足
intSame_Color(GraphG,intn)
Color[n]分别与前面已经着色的几块比较;
相邻并且颜色一样,则不满足;
颜色满足返回0
颜色不满足返回1
对地图行政区域进行第一次着色,始之满足要求
输入参数GraphG,intn
voidLoad_Color(GraphG,intn)
取一种颜色
If(颜色满足,没有与前面冲突)
下一块行政区域着色Load_Color(G,n+1);
Else
尝试另一种颜色
对地图行政区域进行各种方案的显示。
输入参数GraphG,intm
注意:
调用本函数的前提是Color[]数组中有一个正确的填充颜色的方案。
voidPrint_Color(GraphG,intm)
for(i=1;
i<
=4;
i++)
更换颜色,新的颜色不与前面冲突,颜色满足
{
下一个行政区域Print_Color(G,m+1);
直到(到最后一个行政区域,递归出口)
遍历数组Color[],显示所有行政区域颜色,新的方案;
}
/***************************************主函数*******************************************/
Voidmain()
创建地图及行政区域的邻接矩阵;
显示行政区域的邻接矩阵关系;
对地图进行填充颜色;
六、测试结果
七、参考文献
《数据结构》
八、附录
#include<
stdio.h>
math.h>
stdlib.h>
string.h>
/*数据结构期末综合实验*/
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//题目:
地图填色问题~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//地图当前行政区域个数
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;
vexnum;
i++)//构造行政区域-顶点向量
New_Input:
for(t=0;
t<
MAX_VERTEX_NUM;
t++)//清空temp数组
temp[t]=NULL;
printf("
请输入第%d个行政区域(用a~z单字符表示):
"
i+1);
scanf("
%c"
&
vexs[i]);
gets(temp);
if(G->
vexs[i]>
'
z'
||G->
vexs[i]<
a'
)
{//输入的单字符不符合,重新输入
printf("
输入的单字符不符合,重新输入\n"
gotoNew_Input;
}
if(strlen(temp)>
0)//输入的不为单字符,重新输入
{
输入的不为单字符,重新输入\n"
i;
t++)//检测当前输入的行政区域与之前有没有冲突,有冲突,重新输入
if(G->
vexs[i]==G->
vexs[t])
{
printf("
输入的行政区域之前已经输入过,重新输入\n"
gotoNew_Input;
}
}
i++)//初始化邻接矩阵
for(j=0;
j<
j++)
G->
acrs[i][j]=0;
//都为0
for(k=0;
k<
k++)//构造行政区域邻接矩阵
New_Inputs:
请输入与%c相邻的行政区域,已有相邻行政区域有:
G->
vexs[k]);
for(t=0;
vexnum;
t++)//显示与Mg->
vexs[k]已经相邻的行政区域
{
acrs[k][t]==1)
%c"
G->
vexs[t]);
}printf("
\n"
V1=G->
vexs[k];
//V1行政区域
i=k;
//确定v1在G->
vexs中的位置为i
t++)//清空S数组
s[t]=NULL;
t=0;
while(t<
vexnum)//输入与V1相邻的行政区域,存放于S数组中
{
scanf("
s[t]);
if(s[0]=='
\n'
)break;
//没有的话就直接跳出
if(getchar()=='
t++;
}
t++)//确定行政区域V1与其相邻的行政区域的关系,遍历数组S[]
if(s[t]!
=NULL&
&
s[t]!
='
V2=s[t];
//V2行政区域
for(j=0;
vexs[j]!
=V2;
j++);
//确定v2在G中的位置为j
if(j>
vexnum)//输入的元素不正确则显示错误,要求重新输入
{
printf("
输入有误,请重新输入\n"
gotoNew_Inputs;
}
if(V1!
=V2)//输入的相邻行政区域与本身不相同
G->
acrs[i][j]=G->
acrs[j][i]=1;
//置《v1,v2》的对称弧《v2,v1》
inti,j;
地图的邻接矩阵表示,相邻的用1表示\n"
);
|"
//构造图形
G.vexnum;
i++)//横向显示行政区域
G.vexs[i]);
G.vexnum*4+3;
i++)//显示相应长度的-
-"
%c|"
//纵向显示行政区域
printf("
%d"
G.acrs[i][j]);
//显示邻接矩阵
//_________________________________________________________________________________________________
//地图行政区域填充的颜色存储数组
//统计总共的填色方案个数
intSame_Color(GraphG,intn)
inti;
n;
i++)//分别与前面已经着色的几块比较
if(G.acrs[n][i]==1&
Color[i]==Color[n])//相邻并且颜色一样,则不满足
return1;
//与前面颜色有冲突,返回1,表示该颜色不满足
return0;
//没有冲突,该颜色满足,返回0
if(n>
=G.vexnum)//递归出口
}else
for(i=1;
Color[n]=i;
//存储颜色
if(Same_Color(G,n)==0)//颜色满足,没有与前面冲突
Load_Color(G,n+1);
//下一块行政区域
break;
inti=0,j=0;
i++)//尝试更换颜色
Color[m]=i;
if(Same_Color(G,m)==0)//新的颜色不与前面冲突,颜色满足
{
if(m==G.vexnum-1)//到最后一个行政区域,递归出口
j++)//遍历数组Color[],显示所有行政区域颜色,新的方案!
{
switch(Color[j])
case1:
printf("
%c区域填红色,"
G.vexs[j]);
break;
case2:
%c区域填黄色,"
case3:
%c区域填蓝色,"
case4:
%c区域填绿色,"
}
Count++;
//方案加1
}else
Print_Color(G,m+1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 地图 问题
![提示](https://static.bdocx.com/images/bang_tan.gif)