四色问题:

地图染色问题可以根据四色定理来解决。所谓四色定理,就是指可以用不多于四种的颜色对地图着色,使相邻的行政区域不重色,因此我们可以用四色定理的结论,用回溯算法对一幅给定的地图染色。

算法的基本思想是:从第(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])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值