欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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))