版权声明:大家随意浏览。 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