题目描述
已知中国地图,对各省进行着色,要求相邻省所使用的颜色不同,并保证使用的颜***r> 总数最少。
算法思想(不知道这样做对不对看着结果倒是没问题)
区域颜色从第一个颜色开始涂,满足相邻区域颜色不相同条件。
结果
代码
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt # 化图
from matplotlib.patches import Polygon # 上色
import time
# 字典代替邻接矩阵
str = {
'河北省': ['内蒙古自治区', '山西省', '山东省', '北京市', '天津市', '辽宁省'],
'山东省': ['河北省', '天津市', '山西省', '湖南省', '江苏省'],
'安徽省': ['山东省', '湖南省', '湖北省', '江西省', '浙江省', '江苏省'],
'江苏省': ['山东省', '安徽省', '上海市', '浙江省'],
'上海市': ['江苏省', '浙江省'],
'浙江省': ['上海市', '安徽省', '江西省', '福建省', '江苏省'],
'江西省': ['安徽省', '湖北省', '湖南省', '广东省', '福建省', '浙江省'],
'福建省': ['浙江省', '江西省', '广东省'],
'黑龙江省': ['内蒙古自治区', '吉林省'],
'吉林省': ['内蒙古自治区', '黑龙江省'],
'辽宁省': ['内蒙古自治区', '吉林省', '河北省'],
'北京市': ['河北省', '天津市'],
'天津市': ['河北省', '北京市'],
'海南省': [],
'台湾省': [],
'澳门特别行政区': [],
'香港特别行政区': [],
'新疆维吾尔自治区': ['西藏自治区', '青海省', '甘肃省'],
'西藏自治区': ['新疆维吾尔自治区', '青海省', '四川省', '云南省'],
'青海省': ['西藏自治区', '新疆维吾尔自治区', '甘肃省', '四川省'],
'甘肃省': ['新疆维吾尔自治区', '青海省', '四川省', '内蒙古自治区', '陕西省', '宁夏回族自治区'],
'四川省': ['西藏自治区', '青海省', '甘肃省', '陕西省', '重庆市', '贵州省', '云南省'],
'云南省': ['四川省', '贵州省', '广西壮族自治区'],
'内蒙古自治区': ['甘肃省', '宁夏回族自治区', '陕西省', '山西省', '河北省', '吉林省', '辽宁省', '黑龙江省'],
'宁夏回族自治区': ['陕西省', '内蒙古自治区', '甘肃省'],
'陕西省': ['宁夏回族自治区', '甘肃省', '四川省', '内蒙古自治区', '重庆市', '湖北省', '湖南省', '山西省'],
'重庆市': ['陕西省', '四川省', '贵州省', '湖南省', '湖北省'],
'贵州省': ['重庆市', '四川省', '云南省', '广西壮族自治区', '湖南省'],
'广西壮族自治区': ['云南省', '贵州省', '湖南省', '广东省'],
'山西省': ['内蒙古自治区', '陕西省', '河南省', '山东省', '河北省'],
'河南省': ['山西省', '陕西省', '湖北省', '安徽省', '山东省'],
'湖北省': ['河南省', '重庆市', '陕西省', '湖南省', '江西省', '安徽省'],
'湖南省': ['湖北省', '重庆市', '贵州省', '广西壮族自治区', '广东省', '江西省', '安徽省'],
'广东省': ['湖南省', '江西省', '福建省', '广西壮族自治区']}
# 画中国地图
m = Basemap(llcrnrlon=77, llcrnrlat=14, urcrnrlon=140, urcrnrlat=51, projection='lcc', lat_1=33, lat_2=45, lon_0=100)
m.readshapefile('shapefiles/china', 'china', drawbounds=True)
# 得到中国的各个省,使用set不会重复
locatName = set()
for i in m.china_info:
name = i['OWNER']
locatName.add(name.replace("\x00", ""))
# 将set转换为list方便处理
nameList = list(locatName)
print(nameList)
print(len(nameList))
# 初始化每个省的颜色为0
nameDict = dict()
for i in nameList:
nameDict[i] = 0
print(nameDict)
print(len(nameDict))
# 得到 s 省相邻地区的颜色列表
def getColorList(s):
colorList = []
for i in str[s]:
colorList.append(nameDict[i])
return colorList
# 给 seg 地区 画 k 颜色
ax = plt.gca()
def pColor(seg, k):
colorStr = ""
if k == 1:
colorStr = "r"
elif k == 2:
colorStr = "y"
elif k == 3:
colorStr = "b"
elif k == 4:
colorStr = "g"
elif k == 5:
colorStr = "pink"
poly = Polygon(seg, facecolor=colorStr) # r, y, b, g, pink
ax.add_patch(poly)
###############################
# 开始上色
name = ""
colorList = []
c = 0
for seg, mName in zip(m.china, m.china_info):
ttName = mName['OWNER']
tName = ttName.replace("\x00", "")
if tName != name:
colorList = getColorList(tName)
for i in range(1, 6): # 从低到高上色
if i not in colorList: # 不存在就上色
c = i
break
pColor(seg, c)
nameDict[tName] = c
name = tName
plt.show()