一个五条通路的交叉路口,当允许某些通路上的车辆在交叉路口通行时,须对其他通路上的车辆加以限制,不许同时在交叉路口通行,以免发生碰撞。
首先锁定一条道路为进入通道,如锁定A为进入通道,那么出口道路以共有AB、AC、AD。 同理可知以A、B、D为入口各有3种道路组合,C只出 ,E为入口有4种道路,共计13条道路
将这13条道路以表格形式依次列出,当道路同时通车时不会存在冲突的两条道路记为0 ,会发生冲突的道路记为1。得出以下表格
沿着路边的道路均不会产生冲突道路
得到上表之后,生成一个二维列表 (为了方便理解,将该列表定义为冲突列表)
b = [[0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0],
[0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0],
[1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0],
[1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0],
[0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0],
[1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
一共有13种交通路线 ,默认每一条路线的颜色为0
因此再创建一个默认所有指示灯为颜色0的长度为13 的列表,将列表a定义为道路列表 [AB,AC,·····,EC]其中道路颜色默认为0
a = [0 for i in range(13)]
已知冲突存在,所以指示灯颜色最少为2种,最多为13种
每考虑一种可能出现的颜色种类数,就默认从道路列表(a)中的第一的道路指示灯测试起,直至颜色种类满足13条道路都不冲突,结束程序运行。
假设有两种指示灯颜色,从第一条道路开始测试颜色
给当前测试主道路赋予测试颜色,如果该道路与之前已经赋予颜色的道路 颜色一致,且两条道路互为冲突道路,则,通过循环更改主道路颜色
# color_num 为颜色数量
# jd 为测试道路指示灯
for jd in range(len(a)):
for i in range(color_num):
# 第 jd 条道路的指示灯为颜色 i
a[jd] = i
# 添加一个判断变量
bool = True
# 进行冲突测试
# 只循环道路列表中已经赋予颜色且完成测试的道路
for j in range(jd):
if a[jd] == a[j] and b[jd][j] == 1:
# 道路冲突成立,跳出冲突测试,
# 改变当前著道路颜色
bool = False
break
# 如果当前赋予颜色不存在冲突状况,则继续下一个道路的颜色测试
# 存在冲突,则继续测试下一个颜色
if bool:
break
# 如果当前道路加色颜色种类全部测试完,但是依旧存在冲突,
# 则增加颜色种类再次从第一条道路开始尝试
if bool is False:
break
def dye(jd, color_num):
if jd == 13:
print(color_num)
exit(0)
# 依次测试每一种颜色(此时颜色用从0开始的数字表示)
for i in range(color_num):
# 第 jd 条道路的指示灯为颜色 i
a[jd] = i
bool = True
# 进行冲突测试
for j in range(jd):
if a[jd] == a[j] and b[jd][j] == 1:
bool = False
print('冲突道路,重新赋予指示灯颜色')
break
if bool is True:
dye(jd + 1, color_num)
# 例:
# [ab,ac,ad,ba,bd·····]
# 假如现在迭代到了bd(4),已知他和ab(0)为冲突道路,冲突列表中的[0][4] == 1 冲突成立,跳出冲突循环
# bool 为False 进行下一个颜色的测试
# 直至13个道路颜色检测完毕,且没有冲突道路颜色相同的状况出现,完成程序
if __name__ == '__main__':
a = [0 for i in range(13)]
b = [[0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0],
[0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0],
[1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0],
[1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0],
[0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0],
[1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
for color_num in range(2, 14):
dye(0, color_num)