1. 程式人生 > >有 3 只老鼠,8 瓶水,其中一個有毒,喝到有毒的水之後,老鼠一週後會準時死亡.

有 3 只老鼠,8 瓶水,其中一個有毒,喝到有毒的水之後,老鼠一週後會準時死亡.

題目:有 3 只老鼠,8 瓶水,其中一個有毒,喝到有毒的水之後,老鼠一週後會準時死亡.
按照要求,寫個演算法,找出哪個有毒 (以程式語言實現,語言不限)

基本思路:
給瓶子編號 0~7,並把編號翻譯成二進位制串,剛好可以用三位二進位制來表示。讓三隻老鼠分別對應三位二進位制,然後形成如下交叉表:

其中二進位制位為 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瓶水,其中一個有毒,喝到有毒的水之後,老鼠一週後會準時死亡.