【数据结构】使用python解决五岔口道路问题

问题:

一个五条通路的交叉路口,当允许某些通路上的车辆在交叉路口通行时,须对其他通路上的车辆加以限制,不许同时在交叉路口通行,以免发生碰撞
在这里插入图片描述

问题分析

首先锁定一条道路为进入通道,如锁定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
		

完整python代码

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)
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值