数据结构——地图填色问题资料

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《数据结构》实验报告
院系光电与信息工程学院专业电子信息工程
姓名学号电话
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(绿色)};数据描述如下:
INT G[N][N];
INT COLOR[N+1];
四、概要设计
(1)全局变量定义
#define MAX_VERTEX_NUM 26 // 最大行政区域个数
//------------------------------- 邻接矩阵数据类型的定义--------------------------------
typedef struct
{
char vexs[MAX_VERTEX_NUM]; // 行政区域-顶点向量
int acrs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];// 邻接矩阵
int vexnum; // 地图当前行政区域个数
}Graph ;
int Color[MAX_VERTEX_NUM+1]; // 地图行政区域填充的颜色存储数组
long int Count=0; // 统计总共的填色方案个数
(2)本程序主要包含6个函数:
•主函数main()
•显示行政区域的邻接矩阵关系Printf_Graph ()
•对地图行政区域进行第一次着色Load_Color ()
•对地图行政区域进行各种方案着色的显Print_Color ()
•判断这个颜色对第n行政区域能不能满足要求Same_Color()
各函数间调用关系如下:
Create_Graph
Printf_Graph
Main()
Load_Color
Same_Color
Print_Color
(3)主函数的伪码
main()
{
定义一个邻接矩阵G;
创建地图及行政区域的邻接矩阵;
显示行政区域的邻接矩阵关系;
对地图进行填充颜色;
改变颜色,显示多种方案;
}
五、详细设计
//------------------------------- 邻接矩阵数据类型的定义--------------------------------
#define MAX_VERTEX_NUM 26 // 最大行政区域个数
typedef struct
{
char vexs[MAX_VERTEX_NUM]; // 行政区域-顶点向量
int acrs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵
int vexnum; // 地图当前行政区域个数
}Graph ;
/**************************************************************************************** *函数:Create_Graph
*功能:建立地图的邻接矩阵
*说明:输入参数Graph *G
本函数很好的完成了地图的创建以及行政区域之间的存储。

在输入错误的时候,会有相应的指示,使得程序更加健壮。

****************************************************************************************/ void Create_Graph( Graph *G ) // 建立地图行政区域的邻接矩阵
{
输入地图的行政区域的个数G->vexnum ;
输入行政区域,构造行政区域-顶点向量;
初始化邻接矩阵都为0;
构造行政区域邻接矩阵;

输入与V1 相邻的行政区域,存放于S 数组中;
相邻的行政区域G->acrs[i][j]=1;

}
/**************************************************************************************** *函数:Printf_Graph
*功能:显示地图行政区域的邻接矩阵
*说明:输入参数Graph G 。

本函数很好的完成了地图行政区域的邻接矩阵的显示
****************************************************************************************/ void Printf_Graph( Graph G )
{
构造图形;
横向显示行政区域;
纵向显示行政区域;
显示邻接矩阵;
}
/**************************************************************************************** *函数:Same_Color
*功能:判断这个颜色对第n行政区域能不能满足要求
*说明:输入参数Graph G,int n,
输出0 则表示满足,输出1 则表示不满足
****************************************************************************************/ int Same_Color(Graph G,int n)
{
Color[n]分别与前面已经着色的几块比较;
相邻并且颜色一样,则不满足;
颜色满足返回0
颜色不满足返回 1
}
/**************************************************************************************** *函数:Load_Color
*功能:对地图行政区域进行第一次着色,始之满足要求
*说明:输入参数Graph G,int n
****************************************************************************************/ void Load_Color( Graph G , int n )
{
取一种颜色
If(颜色满足,没有与前面冲突)
下一块行政区域着色Load_Color(G,n+1);
Else
尝试另一种颜色
}
/**************************************************************************************** *函数:Print_Color
*功能:对地图行政区域进行各种方案的显示。

*说明:输入参数Graph G,int m
注意:调用本函数的前提是Color[]数组中有一个正确的填充颜色的方案。

****************************************************************************************/ void Print_Color( Graph G , int m)
{
for(i=1;i<=4;i++)
更换颜色,新的颜色不与前面冲突,颜色满足
{
下一个行政区域Print_Color( G , m+1 ) ;
直到(到最后一个行政区域,递归出口)
{
遍历数组Color[],显示所有行政区域颜色,新的方案;
}
}
}
/***************************************主函数*******************************************/ Void main()
{
定义一个邻接矩阵G;
创建地图及行政区域的邻接矩阵;
显示行政区域的邻接矩阵关系;
对地图进行填充颜色;
改变颜色,显示多种方案;
}
六、测试结果
七、参考文献
《数据结构》
八、附录
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
/*数据结构期末综合实验*/
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //题目:地图填色问题~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#define MAX_VERTEX_NUM 26 // 最大行政区域个数
//------------------------------- 邻接矩阵数据类型的定义--------------------------------
typedef struct
{
char vexs[MAX_VERTEX_NUM]; // 行政区域-顶点向量
int acrs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵
int vexnum; // 地图当前行政区域个数
}Graph ;
/**************************************************************************************** *函数:Create_Graph
*功能:建立地图的邻接矩阵
*说明:输入参数Graph *G
本函数很好的完成了地图的创建以及行政区域之间的存储。

在输入错误的时候,会有相应的指示,使得程序更加健壮。

****************************************************************************************/ void Create_Graph( Graph *G ) // 建立地图行政区域的邻接矩阵
{
int i , j , k , t ; // 变量的定义
char s[MAX_VERTEX_NUM]; // 暂时存放与某一行政区域相邻的行政区域char temp[MAX_VERTEX_NUM]; // 临时数组
char V1 , V2 ; // 相邻的两个行政区域的顶点向量
Start:
G->vexnum =0; // 初始化,总的行政区域个数为0 printf("输入地图的行政区域的个数(不超过26个):\t");
scanf("%d",&G->vexnum);
gets(temp);
if( G->vexnum <1||G->vexnum >27) // 输入的数值不在0~26之间重新开始
goto Start;
for(i=0;i<G->vexnum;i++) // 构造行政区域-顶点向量
{
New_Input:
for(t=0;t<MAX_VERTEX_NUM;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");
goto New_Input;
}
if(strlen(temp)>0) // 输入的不为单字符,重新输入
{
printf("输入的不为单字符,重新输入\n");
goto New_Input;
}
for(t=0;t<i;t++) // 检测当前输入的行政区域与之前有没有冲突,有冲突,重新输入
{
if(G->vexs [i]==G->vexs [t])
{
printf("输入的行政区域之前已经输入过,重新输入\n");
goto New_Input;
}
}
}
for(i=0;i<G->vexnum;i++) // 初始化邻接矩阵
for(j=0;j<G->vexnum;j++)
G->acrs[i][j]=0 ; // 都为0
for(k=0;k<G->vexnum;k++) // 构造行政区域邻接矩阵
{
New_Inputs:
printf("请输入与%c相邻的行政区域,已有相邻行政区域有:" ,G->vexs[k]);
for(t=0;t<G->vexnum ;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<MAX_VERTEX_NUM;t++) // 清空S 数组
s[t]=NULL;
t=0;
while(t<G->vexnum) // 输入与V1 相邻的行政区域,存放于S 数组中
{
scanf("%c" , &s[t]);
if(s[0]=='\n') break; // 没有的话就直接跳出
if(getchar()=='\n') break;
t++;
}
for(t=0;t<G->vexnum ;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");
goto New_Inputs;
}
if(V1!=V2) // 输入的相邻行政区域与本身不相同
G->acrs[i][j]=G->acrs[j][i]=1;
// 置《v1,v2》的对称弧《v2,v1》
}
}
}
}
/****************************************************************************************
*函数:Printf_Graph
*功能:显示地图行政区域的邻接矩阵
*说明:输入参数Graph G 。

本函数很好的完成了地图行政区域的邻接矩阵的显示
****************************************************************************************/
void Printf_Graph( Graph G )
{
int i , j ;
printf("地图的邻接矩阵表示,相邻的用1表示\n" );
printf(" |" ); // 构造图形
for(i=0;i<G.vexnum ;i++) // 横向显示行政区域
printf("%c " ,G.vexs [i]);
printf("\n" );
for(i=0;i<G.vexnum*4+3 ;i++) // 显示相应长度的-
printf("-" );
printf("\n" );
for(i=0;i<G.vexnum ;i++)
{
printf("%c|" ,G.vexs [i]); // 纵向显示行政区域
for(j=0;j<G.vexnum ;j++)
{
printf("%d " ,G.acrs[i][j]); // 显示邻接矩阵
}
printf("\n" );
}
}
//_________________________________________________________________________________________________ //_________________________________________________________________________________________________
int Color[MAX_VERTEX_NUM+1]; // 地图行政区域填充的颜色存储数组
long int Count=0; // 统计总共的填色方案个数
/****************************************************************************************
*函数:Same_Color
*功能:判断这个颜色对第n行政区域能不能满足要求
*说明:输入参数Graph G,int n,
输出0 则表示满足,输出1 则表示不满足
****************************************************************************************/
int Same_Color(Graph G,int n)
{
int i ;
for(i=0;i<n;i++) // 分别与前面已经着色的几块比较
if(G.acrs [n][i]==1&&Color[i]==Color[n])// 相邻并且颜色一样,则不满足
{
return 1; // 与前面颜色有冲突,返回1,表示该颜色不满足}
return 0; // 没有冲突,该颜色满足,返回0
}
/****************************************************************************************
*函数:Load_Color
*功能:对地图行政区域进行第一次着色,始之满足要求
*说明:输入参数Graph G,int n
****************************************************************************************/
void Load_Color( Graph G , int n )
{
int i ;
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
*功能:对地图行政区域进行各种方案的显示。

*说明:输入参数Graph G,int m
注意:调用本函数的前提是Color[]数组中有一个正确的填充颜色的方案。

****************************************************************************************/
void Print_Color( Graph G , int m)
{
int i=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<G.vexnum ;j++) // 遍历数组Color[],显示所有行政区域颜色,新的方案!
{
switch(Color[j])
{
case 1:printf("%c区域填红色, ",G.vexs [j]);break;
case 2:printf("%c区域填黄色, ",G.vexs [j]);break;
case 3:printf("%c区域填蓝色, ",G.vexs [j]);break;
case 4:printf("%c区域填绿色, ",G.vexs [j]);break;
}
}
printf("\n");
Count++; // 方案加1
}else
{
Print_Color( G , m+1 ) ; // 下一个行政区域
}
}
}
}
/***************************************主函数*******************************************/
void main()
{
Graph G; // 定义一个邻接矩阵G
Create_Graph( &G); // 创建地图及行政区域的邻接矩阵
Printf_Graph( G ); // 显示行政区域的邻接矩阵关系
printf("着色方案:\n" ); // 着色方案
Load_Color( G , 0 ); // 对地图进行填充颜色
Print_Color( G , 0 ); // 改变颜色,显示多种方案
printf("\n总填充方案%d个\n",Count);
}。

相关文档
最新文档