999瓶水一瓶毒药,10只小鼠,使用python暴力编程

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}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个用Java编写的解决方案: ```java import java.util.ArrayList; import java.util.List; public class PoisonTesting { static void main(String[] args) { int numBottles = 10; int numDays = 8; int numMice = 4; int[][] testMatrix = generateTestMatrix(numBottles, numDays); int poisonedBottle = runTests(testMatrix, numMice, numDays); System.out.println("The poisoned bottle is: " + poisonedBottle); } // 生成测试矩阵 public static int[][] generateTestMatrix(int numBottles, int numDays) { int[][] matrix = new int[numDays][numBottles]; for (int i = 0; i < numDays; i++) { int value = 1 << i; for (int j = 0; j < numBottles; j++) { if ((j & value) != 0) { matrix[i][j] = 1; } } } return matrix; } // 运行实验,找出毒药所在的瓶子 public static int runTests(int[][] testMatrix, int numMice, int numDays) { List<Integer> aliveMice = new ArrayList<>(); for (int i = 0; i < numMice; i++) { aliveMice.add(i + 1); } for (int day = 0; day < numDays; day++) { List<Integer> survivedMice = new ArrayList<>(); for (int mouse : aliveMice) { if (testMatrix[day][mouse - 1] == 1) { survivedMice.add(mouse); } } aliveMice = survivedMice; } return aliveMice.get(0); } } ``` 这个程序通过生成一个测试矩阵,并使用逐日实验的方式来确定哪瓶药是毒药。首先,使用`generateTestMatrix`方法生成一个大小为`numDays x numBottles`的测试矩阵,矩阵中的每个元素代表对应的小鼠在对应的日子是否喝了对应的瓶子的药水。然后,使用`runTests`方法在每一天根据测试矩阵筛选出活下来的小鼠,并将它们作为下一天的测试对象。最后,返回活下来的最后一只小鼠所在的瓶子编号,即为毒药所在的瓶子。 请注意,这只是一种解决方案,并且假设小鼠对于毒药没有任何免疫力。实际情况可能更加复杂,具体的解决方案可能会有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值