b站1024程序员节蚂蚁的题目
程序员文章站
2022-04-28 18:32:10
...
'''
有一根长27厘米的细木杆,
在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。
木杆很细,不能同时通过两只蚂蚁。
开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。
当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。
假设蚂蚁们每秒钟可以走一厘米的距离,求所有蚂蚁都离开木杆的最短时间和最长时间。
'''
#时间的集合
all_time_list=[]
#zero_list为全部蚂蚁都离开木棍的状态
zero_list=[None,0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,None]
#定义一个左移函数
def move_left(lis,i):
list=lis
i=int(i)
a = lis.index(i)
#判断是否离开木棍
if list[a-1] != None:
list[a-1] = i
list[a] = 0
return list
#定义一个右移函数
def move_right(lis,i):
list=lis
i=int(i)
a=lis.index(i)
#判断是否离开木棍
if list[a+1] !=None:
list[a + 1] = i
list[a] = 0
return list
sta=[0,1]
#0=left 1=right
#利用for循环遍历所有状态的不同组合
for i in sta:
for j in sta:
for r in sta:
for m in sta:
for n in sta:
list = [None,0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 5, 0, 0, 0, None]
#所有状态的集合
sta_list=[None,i,j,r,m,n]
#如果直接for num in list会出bug,所以新建立一个包含了所有蚂蚁的列表
num_list = [1, 2, 3, 4, 5]
#a为时间,即移动的次数
a=0
while True:
#如果全部蚂蚁都离开就将时间加入时间列表并且结束循环
if list == zero_list:
all_time_list.append(a)
break
#如果木棍上还有蚂蚁则执行判断
if list !=zero_list:
for num in num_list:
if num in list:
#如果蚂蚁右边没有蚂蚁并且该蚂蚁的运动状态为1,则执行右移函数
if list[list.index(num) + 1] == 0 and sta_list[num] == 1:
list = move_right(list, num)
else:
#如果蚂蚁右边不为空位并且运动状态为1
if list[list.index(num) + 1] != 0 and sta_list[num] == 1:
#接着判断是否为none,即离开木棍,为none则继续右移,交给右移函数执行
if list[list.index(num) + 1] == None:
list = move_right(list, num)
#不是none则双方都调转方向
else:
list = move_left(list, num)
sta_list[num] = 0
sta_list[list[list.index(num) + 1]] = 1
else:
# 如果蚂蚁左边没有蚂蚁并且该蚂蚁的运动状态为0,则执行左移函数
if list[list.index(num) - 1] == 0 and sta_list[num] == 0:
list = move_left(list, num)
else:
# 如果蚂蚁左边不为空位并且运动状态为0
if list[list.index(num) - 1] != 0 and sta_list[num] == 0:
# 接着判断是否为none,即离开木棍,为none则继续左移,交给左移函数执行
if list[list.index(num) - 1] == None:
list = move_left(list, num)
# 不是none则双方都调转方向
else:
list = move_right(list, num)
sta_list[num] = 1
#其实这句判断可有可无
if list.index(num) - 1 != 0:
sta_list[list[list.index(num) - 1]] = 0
#全部执行完一次移位后a增加1
a += 1
#列举完所有情况后输出all_time_list中的最小值和最大值
print(min(all_time_list))
print(max(all_time_list))
上一篇: 献给祖国千万程序员的1024
下一篇: 1024程序员节
推荐阅读