数据结构地图填色问题Word下载.docx
《数据结构地图填色问题Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构地图填色问题Word下载.docx(13页珍藏版)》请在冰豆网上搜索。
//地图行政区域填充的颜色存储数组
longintCount=0;
//统计总共的填色方案个数
2)本程序主要包含6个函数:
主函数main()
显示行政区域的邻接矩阵关系对地图行政区域进行第一次着色对地图行政区域进行各种方案着色的显
判断这个颜色对第n行政区域能不能满足要求各函数间调用关系如下:
Same_Color
Main
(3)主函数的伪码
main()
{定义一个邻接矩阵G;
创建地图及行政区域的邻接矩阵;
显示行政区域的邻接矩阵关系;
对地图进行填充颜色;
改变颜色,显示多种方案;
}
五、详细设计
#defineMAX_VERTEX_NUM26//最大行政区域个数typedefstruct
//邻接矩阵
/****************************************************************************************
*函数:
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<
stdio.h>
math.h>
stdlib.h>
string.h>
/*数据结构期末综合实验*/
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//题目:
地图填色问题~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#defineMAX_VERTEX_NUM26//最大行政区域个数//邻接矩阵数据类型的定义
//行政区域-顶点向量intacrs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
//邻接矩阵intvexnum;
//地图当前行政区域个数}Graph;
Create_Graph
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"
&
vexnum);
gets(temp);
if(G->
vexnum<
1||G->
vexnum>
27)gotoStart;
//输入的数值不在0~26之间重新开始
for(i=0;
vexnum;
i++)
New_Input:
for(t=0;
t<
MAX_VERTEX_NUM;
t++)
//构造行政区域-顶点向量
//清空temp数组
temp[t]=NULL;
请输入第%d个行政区域(用a~z单字符表示):
"
i+1);
%c"
&
vexs[i]);
gets(temp);
if(G->
vexs[i]>
'
z'
||G->
vexs[i]<
a'
)
{//输入的单字符不符合,重新输入
输入的单字符不符合,重新输入\n"
gotoNew_Input;
if(strlen(temp)>
0)//输入的不为单字符,重新输入
输入的不为单字符,重新输入\n"
i;
t++)//检测当前输入的行政区域与之前有没有冲突,有冲突,重新输入
vexs[i]==G->
vexs[t])
输入的行政区域之前已经输入过,重新输入\n"
//
初始化邻接矩阵
for(j=0;
j<
j++)
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)printf("
%c"
G->
vexs[t]);
}printf("
\n"
V1=G->
vexs[k];
//V1行政区域
i=k;
//确定v1在G->
vexs中的位置为i
//清空S数组
//输入与V1相邻的行政区域,存放于S数组中
t++)s[t]=NULL;
t=0;
while(t<
vexnum)
acrs[i][j]=G->
acrs[j][i]=1;
voidPrintf_Graph(GraphG)
inti,j;
地图的邻接矩阵表示,相邻的用1表示\n"
);
|"
G.vexnum;
i++)printf("
G.vexs[i]);
G.vexnum*4+3;
-"
//构造图形
//横向显示行政区域
//显示相应长度的-
%c|"
//纵向显示行政区域
G.vexnum;
%d"
G.acrs[i][j]);
//显示邻接矩阵
//
//intColor[MAX_VERTEX_NUM+1];
//地图行政区域填充的颜色存储数组longintCount=0;
//统计总共的填色方案个数/****************************************************************************************
判断这个颜色对第n行政区域能不能满足要求
inti;
n;
i++)//分别与前面已经着色的几块比较
if(G.acrs[n][i]==1&
&
Color[i]==Color[n])//相邻并且颜色一样,则不满足
return1;
//与前面颜色有冲突,返回1,表示该颜色不满足}
return0;
//没有冲突,该颜色满足,返回0
*函数:
Load_Color
对地图行政区域进行第一
次着色
,始之满足要求
输入参数GraphG,
intn
voidLoad_Color(GraphG,intn){
//递归出口
if(n>
=G.vexnum)
}else
Color[n]=i;
if(Same_Color(G,n)==0)
Load_Color(G,n+1);
break;
//存储颜色
//颜色满足,没有与前面冲突
//下一块行政区域
Print_Color*功能:
voidPrint_Color(GraphG,intm){
inti=0,j=0;
i++){
Color[m]=i;
if(Same_Color(G,m)==0)
if(m==G.vexnum-1)
j++){
switch(Color[j])
//尝试更换颜色
//新的颜色不与前面冲突,颜色满足
//到最后一个行政区域,递归出口
//遍历数组Color[],显示所有行政区域颜色,新的方案!
case1:
%c区域填红色,"
G.vexs[j]);
break;
case2:
%c区域填黄色,"
case3:
%c区域填蓝色,"
case4:
%c区域填绿色,"
Count++;
//方案加1
Print_Color(G,m+1);
//下一个行政区域
voidmain()
GraphG;
Create_Graph(&
G);
Printf_Graph(G);
着色方案:
\n"
Load_Color(G,0);
Print_Color(G,0);
\n总填充方案%d个\n"
Count);
//定义一个邻接矩阵G
//创建地图及行政区域的邻接矩阵
//显示行政区域的邻接矩阵关系
//着色方案
//对地图进行填充颜色
//改变颜色,显示多种方案