中国地图的四色问题

首先,该问题需要运用到数据结构无向图的相关知识。

将中国地图(不包含台湾、海南)看做是一张无向图,相邻接的省份用直线相互连接,就能够得到一张无向图。

中国地图的四色问题_第1张图片

用邻接矩阵的方法来存储该无向图,相邻结点对应数字1,不相邻结点对应数字0。

.然后,在主函数中从一种颜色开始循环,直到满足能用这几种颜色填满地图(方法数不为0)。

for(i=1;i<100;i++)
{
dfs(1,i);
if(WayNumber!=0){
printf("填满地图至少需要%d种颜色\n",i);
break;
}


用递归的方法进行广度遍历,用数字1,2,3,4......表示颜色,构造一个用于存放颜色的数组area[],

当邻接矩阵Map[i][j]等于1时,对应的area[i]和area[j]的值不能相同,通过for循环从颜色1开始,

不断进行上色,最终判断全部结点都已染色时,方法数加1。

for(i=0;i{
int biaoshi=1;

for(j=1;j{
if((Map[j][youbiao]==1)&&(area[j]==i)) 
{
biaoshi=0;
break;
}
}
if(biaoshi)
{
area[youbiao]=i;  //游标所在省份染为第i种颜色
}       


源程序:

#include

#include
#define AREANUMBER 27


int WayNumber=0;  //方法数
int Map[AREANUMBER+1][AREANUMBER+1];
int area[AREANUMBER+1];


/*typedef struct ArcNode{
int number;  //和该顶点邻接的顶点编号
struct ArcNode *next;  //顶点指向的下一个位置
}ArcNode;


typedef struct{
int data;  //对应顶点的编号
ArcNode *firstnext;  //和该顶点邻接的第一个顶点编号
}ArcList;


typedef ArcList Map[AREANUMBER];  //地图的邻接表数组
*/


void CreateMap(int Map[AREANUMBER+1][AREANUMBER+1]);  //地图创建函数
void dfs(int now,int ColorNumber);  //深度遍历函数


void main(){
int i,j;
for(i=1;i<=AREANUMBER;i++)
for(j=1;j<=AREANUMBER;j++)
Map[i][j]=0;
CreateMap(Map);
for(i=1;i<100;i++)
{
dfs(1,i);
if(WayNumber!=0){
printf("填满地图至少需要%d种颜色\n",i);
break;
}
}
}


void CreateMap(int Map[AREANUMBER+1][AREANUMBER+1]){
/*ArcNode *p,*q;


GL[1].data=1;


p=(ArcNode *)malloc(sizeof(ArcNode));
p->number=3;
p=GL[1].firstnext;


q=(ArcNode *)malloc(sizeof(ArcNode));
q->number=4;
q=p->next;


p=(ArcNode *)malloc(sizeof(ArcNode));
p->number=2;
p=q->next;
*/
Map[1][2]=Map[2][1]=1;  //新疆
Map[1][3]=Map[3][1]=1;
Map[1][4]=Map[4][1]=1;


Map[2][4]=Map[4][2]=1;  //西藏
Map[2][5]=Map[5][2]=1;
Map[2][10]=Map[10][2]=1;


Map[3][4]=Map[4][3]=1;  //甘肃
Map[3][5]=Map[5][3]=1;
Map[3][7]=Map[7][3]=1;
Map[3][8]=Map[8][3]=1;
Map[3][12]=Map[12][3]=1;


Map[4][5]=Map[5][4]=1;  //青海


Map[5][6]=Map[6][5]=1;  //四川
Map[5][8]=Map[8][5]=1;
Map[5][9]=Map[9][5]=1;
Map[5][10]=Map[10][5]=1;


Map[6][8]=Map[8][6]=1;  //重庆
Map[6][9]=Map[9][6]=1;
Map[6][13]=Map[13][6]=1;
Map[6][14]=Map[14][6]=1;


Map[7][8]=Map[8][7]=1;  //宁夏
Map[7][12]=Map[12][7]=1;


Map[8][12]=Map[12][8]=1;  //陕西
Map[8][14]=Map[14][8]=1;
Map[8][15]=Map[15][8]=1;
Map[8][16]=Map[16][8]=1;


Map[9][10]=Map[10][9]=1;  //贵州
Map[9][11]=Map[11][9]=1;
Map[9][13]=Map[13][9]=1;


Map[10][11]=Map[11][10]=1;  //云南


Map[11][26]=Map[26][11]=1;  //广西
Map[11][13]=Map[13][11]=1;


Map[12][15]=Map[15][12]=1;  //内蒙古
Map[12][17]=Map[17][12]=1;
Map[12][18]=Map[18][12]=1;
Map[12][19]=Map[19][12]=1;
Map[12][20]=Map[20][12]=1;


Map[13][14]=Map[14][13]=1;  //湖南
Map[13][24]=Map[24][13]=1;
Map[13][26]=Map[26][13]=1;


Map[14][16]=Map[16][14]=1;  //湖北
Map[14][22]=Map[22][14]=1;
Map[14][24]=Map[24][14]=1;


Map[15][16]=Map[16][15]=1;  //山西
Map[15][17]=Map[17][15]=1;


Map[16][17]=Map[17][16]=1;  //河南
Map[16][21]=Map[21][16]=1;
Map[16][22]=Map[22][16]=1;


Map[17][20]=Map[20][17]=1;  //河北
Map[17][21]=Map[21][17]=1;

Map[18][19]=Map[19][18]=1;  //黑龙江


Map[19][20]=Map[20][19]=1;  //吉林
                                //辽宁
Map[21][23]=Map[23][21]=1;  //山东


Map[22][23]=Map[23][22]=1;  //安徽
Map[22][24]=Map[24][22]=1;
Map[22][25]=Map[25][22]=1;


Map[23][25]=Map[25][23]=1;  //江苏


Map[24][25]=Map[25][24]=1;  //江西
Map[24][26]=Map[26][24]=1;
Map[24][27]=Map[27][24]=1;


Map[25][27]=Map[27][25]=1;  //浙江


Map[26][27]=Map[27][26]=1;  //广东
                           //福建
}


void dfs(int youbiao,int ColorNumber){
int i,j,k;
for(i=0;i {
int biaoshi=1;

for(j=1;j {
if((Map[j][youbiao]==1)&&(area[j]==i))  //游标所在省与j省邻接,且j省被染为第i种颜色
{
biaoshi=0;
break;
}
}

if(biaoshi)
{


area[youbiao]=i;  //游标所在省份染为第i种颜色


if(youbiao==AREANUMBER)  //全部结点都已染色
WayNumber++;  //方法数+1
else
dfs(youbiao+1,ColorNumber);  //下一个省份染色


}       

}

你可能感兴趣的:(中国地图的四色问题)