猎人抓兔子的bfs搜索解法

版权声明:大家随意浏览。 https://blog.csdn.net/sinat_30062549/article/details/83009676

有五个山洞,一字排开,一只兔子住在某个洞,每天晚上会换住到相邻的洞中,一个猎人只能每天上去一个洞,问怎样的检查序列能确保抓到兔子。


这个问题,可以说是一个智力题了,当然我的智力没有达标,所以没有想出来。

所以我打算写一段代码找出一个可以实现的序列,来减少我脑细胞的消耗。

要找出一个序列,当然市越短越好了,所以我运用bfs的搜索方法来记录当天检查的洞,兔子可能的藏身之洞以及之前检查的洞。

代码有注释,我就不bb了。


#coding:utf-8
'''
n为当天晚上要查看的洞
list1为肯能是兔子藏身的洞的集合
set2为当查看n后,没有抓到兔子,兔子可能藏身的集合
'''
def getNewSet(n,list1):
    set2 = set()
    for i in list1:
        if i+1 != n and i+1<=5:
            set2.add(i+1)
        if i-1 != n and i-1>=1:
            set2.add(i-1)
    return  set2

import Queue
if __name__== '__main__':
    '''
    bfs进行搜索,首先将初始情况加入队列,
    1.当队列部不空时:
        2.如果已经得到了结果,那就结束,跳转到(7.)
        3.取出队列的第一个值
        4.分别检查5个洞,
            5.如果检查之后兔子的藏身洞变少,那就将这个洞加入到队列中;
            6.如果检查后兔子没有藏身之处,则已经找到结果
              将结果赋值给ans同时设置已找到结果标志,并跳出循环
    7.输出最后记录的结果
    8.根据得到的结果,找出每一步后兔子藏身之处
    '''
    Q = Queue.Queue()
    # for i in range(1,6):
    Q.put((0,set([1,2,3,4,5]),[]))
    rn = 0
    ans = []
    # 1.
    while not Q.empty() :
        # 2.
        if rn == 1:
            break
        # 3.
        n,set1,list1 = Q.get()
        # 4.
        for i in range(1,6):
            tlist = list1[:]
            set2 = getNewSet(i,set1)
            # 5.
            if len(set1)>=len(set2):

                tlist.append(n)
                # print set1,i, set2,tlist
                Q.put((i,set2,tlist))
            # 6.
            if not set2:
                tlist.append(i)
                ans = tlist
                rn = 1
                break
    # 7.
    print ans
    # 8.
    set3 = set([1,2,3,4,5])
    for i in ans[1:]:
        set3 = getNewSet(i,set3)
        print i,set3

猜你喜欢

转载自blog.csdn.net/sinat_30062549/article/details/83009676
今日推荐