理论上4种颜色就够了.地图的四色问题嘛!
可能会有多组解。用递归(dfs)就可以输出所有解了。键搏扮
地图着色算法C语言源代码
前面我写了一个地图着色(即四色原理)的C源代码。
写完以后想了一下,感觉还不完善,因为从实际 *** 作稿灶的角度来考虑,四种可用的颜色放在旁边,不同的人可能会有不同的选择顺序,另外,不同的人可能会选择不同的城市作为着色的起点,而当时的程序没有考虑这个问题。于是,把程序修改为下面的样子,还请同行分析并指出代码中的不足之处:
#i nclude <stdio.h>
#define N 21
int allcolor[4]/*可用的颜色*/
int ok(int metro[N][N],int r_color[N],int current)
{/*ok函数和下面的go函数和原来的一样,保留用来比较两种算法*/
int j
for(j=1j<currentj++)
if(metro[current][j]==1&&r_color[j]==r_color[current])
return 0
return 1
}
void go(int metro[N][N],int r_color[N],int sum,int current)
{
int i
if(current<=sum)
for(i=1i<=4i++)
{
r_color[current]=i
if(ok(metro,r_color,current))
{
go(metro,r_color,sum,current+1)
return
}
}
}
void color(int metro[N][N],int r_color[N],int sum,int start)
{
int i,j,k
r_color[start]=allcolor[0]
for(i=start+1i!=starti=(i+1)%(sum+1))/*把所有编号看作一个环*/
if(i==0)/*城市号从1开始编号,故跳过0编号*/
continue
else
for(j=0j<4j++)
{
r_color[i]=allcolor[j]/*选取下一种颜色,根据allcolor中颜色顺序不同,结果不同*/
for(k=1k<ik++)/*检查是否有冲突,感觉还可以改进,如使用禁忌搜索法*/
if(metro[i][k]==1&&r_color[k]==r_color[i])
break
if(k>=i)
break
}
}
void main()
{
int r_color[N]={0}
int t_color[N]={0}
int i
int start/*着色的起点*/
int metro[N][N]={{0},
{0,1,1,1,1,1,1},
{0,1,1,1,1},
{0,1,1,1,0,0,1},
{0,1,1,0,1,1},
{0,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0,1},
{0,1,0,1,0,1,1,1,1,1},
{0,0,0,0,0,0,1,1,1},
{0,0,0,0,0,0,1,1,1,1,0,0,1},
{0,0,0,0,0,1,1,0,1,1,0,0,1,1,1,0,1},
{0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,1,0,0,0,1},
{0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,1},
{0,0,0,0,0,0,0,0,1,1,0,1,1,1,0,0,0,0,0,1,1},
{0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1},
{0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1},
{0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,1,1,1,0,1},
{0,0,0,0,1,0,0,0,1,0,0,0,0,1,1,1,1},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1},
{0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,1,1,1},
{0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1}}
allcolor[0]=1allcolor[1]=2allcolor[2]=3allcolor[3]=4/*选色顺序,顺序不同,结果不同*/
start=1
/* clrscr()*/
printf("\nAll color is:\n")
for(i=0i<4i++)/*当前选色顺序*/
printf("%d",allcolor[i])
go(metro,r_color,20,1)
printf("\nFirst method:\n")
for(i=1i<=20i++)
printf("%3d",r_color[i])
color(metro,t_color,20,start)
printf("\nSecond method:\n")
printf("\nAnd the start metro is:%d\n",start)
for(i=1i<=20i++)
printf("%3d",t_color[i])
}
说是人性化着色,其实还有一个问题没有考虑,那就是 *** 作员跳跃式着色,就像大家玩“扫雷”游戏一样。其实也容易实现,可以像定义选色顺序一样定义着色顺序。
如何利用gis制作红色地图,这里分享下 *** 作方法。
设备:联想电脑
系统:win8
软件:ArcMap 10.5
1、首先双击打开gis软件,运行软毕哗件,单击“新建地图”中的“我的模板”,打开一个空白模板。
2、单击“文件”,再单击“添加数据”中的“添加底图”。
3、选择“中国地图彩色英文版(含POI点)”这个底图,因为arcmap10.5只有这个版本含POI的,如果有“中国地图彩色中文版(含POI点)手冲行”的建议选择中文版的底图。
4、放大找到自己要标注的项目位置后,在菜单栏中的“视图”工具选择“布局视图”。
5、然后可以建立一个标题和给项目位判孙置添加标注和文字说明。
6、最后使位置图更完善,这样位置图就做好了。
想要在隐正中国地图上把新疆,西藏,陕西,甘肃,青海福建天成为橘色,先要找一张中国行政区域空白图,带有轮廓的空白卜渣图,然型携悄后把这些省区。涂上橘色就可以了,用水彩笔。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)