有 3 只老鼠,8 瓶水,其中一个有毒,喝到有毒的水之后,老鼠一周后会准时死亡.

Posted hglibin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有 3 只老鼠,8 瓶水,其中一个有毒,喝到有毒的水之后,老鼠一周后会准时死亡.相关的知识,希望对你有一定的参考价值。

题目:有 3 只老鼠,8 瓶水,其中一个有毒,喝到有毒的水之后,老鼠一周后会准时死亡.
按照要求,写个算法,找出哪个有毒 (以程序语言实现,语言不限)

基本思路:
给瓶子编号 0~7,并把编号翻译成二进制串,刚好可以用三位二进制来表示。让三只老鼠分别对应三位二进制,然后形成如下交叉表:

        老鼠1    老鼠2   老鼠3
0   =    0        0       0
1   =    0        0       1
2   =    0        1       0
3   =    0        1       1
4   =    1        0       0
5   =    1        0       1
6   =    1        1       0
7   =    1        1       1

其中二进制位为 1 的地方表示哪只老鼠吃哪瓶药。即:
老鼠 1 应该喝 4,5,6,7 号的药;
老鼠 2 应该喝 2,3,6,7 号的药;
老鼠 3 应该喝 1,3,5,7 号的药。
最后观察的时候,可以根据老鼠死了的情况,0 表示没死,1 表示死了。
比如三只老鼠死了的情况是 (1,0,1) 则表示 5 号药是有毒的。因为只有这种情况下才会导致老鼠 1 和老鼠 3 死掉。

C++实现:

#include <iostream>

using namespace std;
int main() {
    int NUM_MOUSE = 3;
    int mouseDead[NUM_MOUSE];

    cout << "输入老鼠存活情况,1-死了,0-活着,用空格隔开:" << endl;
    for (int i = 0; i < NUM_MOUSE; i++) {
        cin >> mouseDead[i];
    }

    int drug = 0;
    for (int i = 0; i < NUM_MOUSE; i++) {
        int dead = mouseDead[i];
        drug |= (dead << (NUM_MOUSE - i - 1));
    }
    cout << "有毒的是 " << drug << " 号药!" << endl;

    return 0;
}

技术分享图片

拓展:
假如有 1000 瓶水,只有一瓶是有毒药的,请问需要多少只老鼠来做实验?
答案是十只,也就是说 10 位二进制最大能表示 1024 个数字(从 0 开始算起)

参考链接:
百度知道:有3只老鼠,8瓶水,其中一个有毒,喝到有毒的水之后,老鼠一周后会准时死亡.

以上是关于有 3 只老鼠,8 瓶水,其中一个有毒,喝到有毒的水之后,老鼠一周后会准时死亡.的主要内容,如果未能解决你的问题,请参考以下文章

问题:有1000杯水,其中有一杯是毒水,现在需要从中找出含毒药的水,可以用老鼠来实验;老鼠如果喝了有毒的水,一个小时内必死,请问如何安排试验,能够用最少的实验材料在一个小时内检测出有毒的水?

经典老鼠毒药问题

7只老鼠测试100个瓶子

一个有趣的问题,用10只蚂蚁从1000瓶水中找出唯一有毒的一瓶

老鼠和毒药(面试题)

智力题目集锦