问题介绍
地图着色问题是一个抽象的图形学问题,用程序实现对各个区域进行着色,并且相邻区域所用的颜色不同,同时保证颜色的总数最少,那么就是如何将这些抽象的问题进行数据化。如何将程序所需要的功能模拟着色在计算机中编程实现。
问题解决
先将每个城市与城市分界线进行数字化,将每个城市的地图颜色设为初始值0即为白色,在循环中判断目前城市的颜色和与当前城市有分界线的城市是否存在颜色相同。如果存在就将数字加一(改变颜色)。
流程图
初始化模块
typedef structArcNode
{
int x; // 表示与当前顶点所表示城市相邻的省份的位置信息
struct ArcNode *next; // 指向下一个弧结点
}ArcNode; // 表示城市之间相邻关系的弧结点
typedef struct
{
char *name; // 顶点所表示的城市的名称
int color; // 城市的颜色,用数字表示不同的颜色
ArcNode *firstnext; // 指向第一个弧
}City[13];
着色模块
for(i=1;i<=13;i++)
{
city[i].color=0;
}
for(i=1;i<=13;i++)
{
j=1;
p=city[i].firstnext;
while(p!=NULL)
{
while(p!=NULL&&j!=city[p->x].color)
{
p=p->next;
}
if(p!=NULL)
j++;
}
city[i].color=j;
}
输出模块
for(i=1;i<=13;i++)
{
printf("%s:",city[i].name);
printf("%d\n",city[i].color);
}
详细代码
#include <stdio.h>
#include <stdlib.h>
typedef struct ArcNode{
int x; // 表示与当前顶点所表示城市相邻的省份的位置信息
struct ArcNode *next;
}ArcNode; // 表示城市之间相邻关系的弧结点
typedef struct{
char *name; // 顶点所表示的城市的名称
int color;
ArcNode *firstnext; // 指向第一个弧
}City[13];
int main()
{
City city;
int i,j;
ArcNode
*p,*hu1,*hu2,*hu3,*hu4,*hu5,*hu6,*hu7,*hu8,*hu9,*hu10,*hu11,*hu12,*hu13,*hu14,*hu15,*hu16,*hu17,*hu18;
ArcNode *hu19,*hu20,*hu21,*hu22,*hu23,*hu24,*hu25,*hu26,*hu27,*hu28,*hu29,*hu30,*hu31,*hu32,*hu33,*hu34,*hu35;
ArcNode *hu36,*hu37,*hu38,*hu39,*hu40,*hu41,*hu42,*hu43,*hu44,*hu45,*hu46,*hu47,*hu48,*hu49,*hu50,*hu51,*hu52;
ArcNode *hu53,*hu54,*hu55,*hu56,*hu57,*hu58,*hu59,*hu60,*hu61,*hu62;//声明表示城市顶点的信息
hu1=(ArcNode *)malloc(sizeof(ArcNode));
hu2=(ArcNode *)malloc(sizeof(ArcNode));
hu3=(ArcNode *)malloc(sizeof(ArcNode));
hu4=(ArcNode *)malloc(sizeof(ArcNode));
hu5=(ArcNode *)malloc(sizeof(ArcNode));
hu6=(ArcNode *)malloc(sizeof(ArcNode));
hu7=(ArcNode *)malloc(sizeof(ArcNode));
hu8=(ArcNode *)malloc(sizeof(ArcNode));
hu9=(ArcNode *)malloc(sizeof(ArcNode));
hu10=(ArcNode *)malloc(sizeof(ArcNode));
hu11=(ArcNode *)malloc(sizeof(ArcNode));
hu12=(ArcNode *)malloc(sizeof(ArcNode));
hu13=(ArcNode *)malloc(sizeof(ArcNode));
hu14=(ArcNode *)malloc(sizeof(ArcNode));
hu15=(ArcNode *)malloc(sizeof(ArcNode));
hu16=(ArcNode *)malloc(sizeof(ArcNode));
hu17=(ArcNode *)malloc(sizeof(ArcNode));
hu18=(ArcNode *)malloc(sizeof(ArcNode));
hu19=(ArcNode *)malloc(sizeof(ArcNode));
hu20=(ArcNode *)malloc(sizeof(ArcNode));
hu21=(ArcNode *)malloc(sizeof(ArcNode));
hu22=(ArcNode *)malloc(sizeof(ArcNode));
hu23=(ArcNode *)malloc(sizeof(ArcNode));
hu24=(ArcNode *)malloc(sizeof(ArcNode));
hu25=(ArcNode *)malloc(sizeof(ArcNode));
hu26=(ArcNode *)malloc(sizeof(ArcNode));
hu27=(ArcNode *)malloc(sizeof(ArcNode));
hu28=(ArcNode *)malloc(sizeof(ArcNode));
hu29=(ArcNode *)malloc(sizeof(ArcNode));
hu30=(ArcNode *)malloc(sizeof(ArcNode));
hu31=(ArcNode *)malloc(sizeof(ArcNode));
hu32=(ArcNode *)malloc(sizeof(ArcNode));
hu33=(ArcNode *)malloc(sizeof(ArcNode));
hu34=(ArcNode *)malloc(sizeof(ArcNode));
hu35=(ArcNode *)malloc(sizeof(ArcNode));
hu36=(ArcNode *)malloc(sizeof(ArcNode));
hu37=(ArcNode *)malloc(sizeof(ArcNode));
hu38=(ArcNode *)malloc(sizeof(ArcNode));
hu39=(ArcNode *)malloc(sizeof(ArcNode));
hu40=(ArcNode *)malloc(sizeof(ArcNode));
hu41=(ArcNode *)malloc(sizeof(ArcNode));
hu42=(ArcNode *)malloc(sizeof(ArcNode));
hu43=(ArcNode *)malloc(sizeof(ArcNode));
hu44=(ArcNode *)malloc(sizeof(ArcNode));
hu45=(ArcNode *)malloc(sizeof(ArcNode));
hu46=(ArcNode *)malloc(sizeof(ArcNode));
hu47=(ArcNode *)malloc(sizeof(ArcNode));
hu48=(ArcNode *)malloc(sizeof(ArcNode));
hu49=(ArcNode *)malloc(sizeof(ArcNode));
hu50=(ArcNode *)malloc(sizeof(ArcNode));
hu51=(ArcNode *)malloc(sizeof(ArcNode));
hu52=(ArcNode *)malloc(sizeof(ArcNode));
hu53=(ArcNode *)malloc(sizeof(ArcNode));
hu54=(ArcNode *)malloc(sizeof(ArcNode));
hu55=(ArcNode *)malloc(sizeof(ArcNode));
hu56=(ArcNode *)malloc(sizeof(ArcNode));
hu57=(ArcNode *)malloc(sizeof(ArcNode));
hu58=(ArcNode *)malloc(sizeof(ArcNode));
hu59=(ArcNode *)malloc(sizeof(ArcNode));
hu60=(ArcNode *)malloc(sizeof(ArcNode));
hu61=(ArcNode *)malloc(sizeof(ArcNode));
hu62=(ArcNode *)malloc(sizeof(ArcNode));
city[1].name="苏州市";
hu1->x=2;
hu2->x=8;
hu3->x=7;
city[1].firstnext=hu1;//声名表示城市之间相邻的弧
hu1->next=hu2;
hu2->next=hu3;
hu3->next=NULL;
city[2].name="无锡市";
hu4->x=3;
hu5->x=7;
hu6->x=1;
city[2].firstnext=hu4;
hu4->next=hu5;
hu5->next=hu6;
hu6->next=NULL;
city[3].name="常州市";
hu7->x=4;
hu8->x=5;
hu9->x=2;
hu10->x=7;
city[3].firstnext=hu7;
hu7->next=hu8;
hu8->next=hu9;
hu9->next=hu10;
hu10->next=NULL;
city[4].name="镇江市";
hu12->x=6;
hu13->x=7;
hu14->x=3;
hu11->x=5;
city[4].firstnext=hu12;
hu12->next=hu13;
hu13->next=hu14;
hu14->next=hu11;
hu11->next=NULL;
city[5].name="南京市";
hu15->x=6;
hu16->x=10;
hu18->x=3;
hu17->x=4;
city[5].firstnext=hu15;
hu15->next=hu16;
hu16->next=hu18;
hu18->next=hu17;
hu17->next=NULL;
city[6].name="扬州市";
hu19->x=7;
hu20->x=9;
hu21->x=10;
hu22->x=5;
hu23->x=4;
city[6].firstnext=hu19;
hu19->next=hu20;
hu20->next=hu21;
hu21->next=hu22;
hu22->next=hu23;
hu23->next=NULL;
city[7].name="泰州市";
hu24->x=8;
hu26->x=1;
hu27->x=2;
hu28->x=3;
hu29->x=4;
hu30->x=6;
hu60->x=9;
city[7].firstnext=hu24;
hu24->next=hu26;
hu26->next=hu27;
hu27->next=hu28;
hu28->next=hu29;
hu29->next=hu30;
hu30->next=hu60;
hu60->next=NULL;
city[8].name="南通市";
hu32->x=1;
hu33->x=7;
hu57->x=9;
city[8].firstnext=hu32;
hu32->next=hu33;
hu33->next=hu57;
hu57->next=NULL;
city[9].name="盐城市";
hu35->x=11;
hu38->x=6;
hu55->x=10;
hu58->x=8;
hu61->x=7;
city[9].firstnext=hu35;
hu35->next=hu38;
hu38->next=hu55;
hu55->next=hu58;
hu58->next=hu61;
hu61->next=NULL;
city[10].name="淮安市";
hu39->x=11;
hu40->x=12;
hu42->x=6;
hu43->x=5;
hu56->x=9;
city[10].firstnext=hu39;
hu39->next=hu40;
hu40->next=hu42;
hu42->next=hu43;
hu43->next=hu56;
hu56->next=NULL;
city[11].name="连云港市";
hu44->x=12;
hu45->x=13;
hu46->x=10;
hu47->x=9;
city[11].firstnext=hu44;
hu44->next=hu45;
hu45->next=hu46;
hu46->next=hu47;
hu47->next=NULL;
city[12].name="宿迁市";
hu48->x=13;
hu49->x=11;
hu50->x=10;
city[12].firstnext=hu48;
hu48->next=hu49;
hu49->next=hu50;
hu50->next=NULL;
city[13].name="徐州市";
hu51->x=11;
hu52->x=12;
city[13].firstnext=hu51;
hu51->next=hu52;
hu52->next=NULL;
for(i=1;i<=13;i++)
{
city[i].color=0;
}
for(i=1;i<=13;i++)
{
j=1;
p=city[i].firstnext;
while(p!=NULL)
{
while(p!=NULL&&j!=city[p->x].color)
{
p=p->next;
}
if(p!=NULL)
j++;
}
city[i].color=j;
}//分别为各城市着色
for(i=1;i<=13;i++)
{
printf("%s:",city[i].name);
printf("%d\n",city[i].color);
}//输出各城市颜色信息
printf("/n 0表示白色,1表示蓝色,2表示红色,3表示绿色,4表示黄色");
return 0;
}