地图染色问题可以根据四色定理来解决。所谓四色定理,就是指可以用不多于四种的颜色对地图着色,使相邻的行政区域不重色,因此我们可以用四色定理的结论,用回溯算法对一幅给定的地图染色。
算法的基本思想是:从第(1)号行政区域开始染色,每个区域逐次用颜色1#、2#、3#、4#进行试探,若当前所取的颜色与周围已染色的行政区域不重色,则用栈记下该区域的颜色序号,否则依次用下一颜色进行试探;若出现用1#到4#颜色均与相邻区域的颜色重色,则需退栈回溯,修改当前栈顶的颜色序号,再进行试探。直到所有行政区域都已分配合适的颜色。
行政地图如下:
def mapcolor(adjamat):
signcolor=[0]*N
color = 1
signcolor[0] = 1
area = 1
while area < N:
while color <= 4:
if area >= N:
break
k = 0
while (k < area) and (signcolor[k] * adjamat[area][k] != color): # 判断是否重色
k += 1
if (k < area):
color += 1
else:
signcolor[area] = color
area += 1
color = 1
if color > 4: # 没有找到合适的颜色,需要进行回溯
area -= 1
color = signcolor[area] + 1
return signcolor
city = {1: '朝阳市', 2: '葫芦岛市', 3: '阜新市', 4: '锦州市', 5: '盘锦市', 6: '沈阳市', 7: '辽阳市',
8: '鞍山市', 9: '营口市', 10: '铁岭市', 11: '抚顺市', 12: '本溪市', 13: '丹东市', 14: '大连市'}
N = len(city)
colordict = {1: '红色', 2: '橙色', 3: '黄色', 4: '青色'}
adjamat = [[0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], # 辽宁省地图的邻接矩阵
[1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0],
[0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0],
[0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1],
[0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0 ,0, 1],
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0],
[0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0],
[0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1],
[0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0]]
signcolor1 = mapcolor(adjamat)
print(signcolor1)
for key1,key2 in zip(city,signcolor1):
print(city[key1] + ":" + colordict[key2])