1000瓶水中999是水,一瓶是毒,10只小白鼠,小鼠无论喝多少毒水都是在30分钟后死亡,有足够的吸管和空白瓶,50分钟内验证出毒瓶,给出有死亡小鼠序列号,输出有毒瓶号。这个题目应该有10多年了,但一直没找到解决的代码,本人写了一个,虽然解决了问题,但感觉很笨很暴力,贴出代码,请大家指正。
def test(n):
list_death = []
test = []
mouse = []
for i in range(10): # 建立10个小鼠列表,每个列表其二进制某一位是1,数字放到哪一组,表示小鼠喝几号瓶
mouse.append([])
for i in range(1, 1001):
test.append(i)
for i in test:
if i & 0b1 ==1:
mouse[0].append(i)
if i & 2 == 2:
mouse[1].append(i)
if i & 4 == 4:
mouse[2].append(i)
if i & 8 == 8:
mouse[3].append(i)
if i & 16 == 16:
mouse[4].append(i)
if i & 32 == 32:
mouse[5].append(i)
if i & 64 == 64:
mouse[6].append(i)
if i & 128 == 128:
mouse[7].append(i)
if i & 256 == 256:
mouse[8].append(i)
if i & 512 == 512:
mouse[9].append(i)
print(f'第8号小鼠共喝{len(mouse[7])}瓶,没毒死也撑死了')
list_death = []
for i in n:
list_death.append(mouse[i]) # 根据死亡小鼠序列号,将相应小鼠列表中序列号列表拿出
for item in list_death: # 建立未包含死亡小鼠序列号列表
if item in mouse:
mouse.remove(item)
temp1 = []
result = 0
for list1 in list_death: # 将列表转换成集合用于比较数据,建立死亡小鼠序号集合列表
temp1.append(set(list1))
comment_element = temp1[0] # 找出死亡小鼠集合中都包含的瓶数字
temp_comment_set = set()
for i in range(len(temp1)):
comment_element = comment_element.intersection(temp1[i])
for number in comment_element: # 找出死亡小鼠集合中都包含的数字是否包含在未死亡小鼠组中,如果包含则剔除
for list2 in mouse:
if number in list2:
temp_comment_set.add(number)
result = comment_element.difference(temp_comment_set) # 最终保留的一个数字是毒瓶号
print(f'死亡序号是{n}的小鼠,有毒瓶是第{result}瓶')
test([3, 5, 6, 7, 8, 9])
第8号小鼠共喝489瓶,没毒死也撑死了
死亡数是[3, 5, 6, 7, 8, 9]的小鼠,有毒瓶是第{1000}瓶