算法笔记——15个瓶子,4只老鼠,测试哪瓶有毒

看到今天一道算法题,就写了一下自己的思路,希望有大牛,看到这个题,能提出更好的想法,再进行交流学习,我只用了一点简单的C++ 进行实现

有15个瓶子,其中最多有一瓶有毒,现在有四只老鼠,喝了有毒的水之后,第二天就会死。如何在第二天就可以判断出哪个瓶子有毒 

我的想法是,因为最多有一瓶有毒,所以只有,0瓶有毒,或者其中一瓶有毒,所以是16种状态,所以用4只老鼠的喝下水的存活状态标级 '0' 或者 '1',来进行标记对应的瓶子 

0000 => 无毒
0001 => 1号瓶
0010 => 2号瓶
0011 => 3号瓶
0100 => 4号瓶
0101 => 5号瓶
0110 => 6号瓶
0111 => 7号瓶
1000 => 8号瓶
1001 => 9号瓶
1010 => 10号瓶
1011 => 11号瓶
1100 => 12号瓶
1101 => 13号瓶
1110 => 14号瓶
1111 => 15号瓶
将水喂给当前瓶子编号每一位为 '1' 的老鼠,例如第7号瓶子,则给第二只,第三只,第四只老鼠喂瓶子里面的水,最后观察老鼠的存活状态,来判断是哪一瓶,比如最后是 '1011' 则是11号瓶有毒。

下面是代码实现,代码方面我觉得这就是一个从输入老鼠状态到判断是哪个瓶子有毒的过程。前面这个阶段,如果通过老鼠碰到是否有毒的水,来确认是否死亡状态,则需要知道水是否有毒,提前知道哪瓶,再去判断。则有些自欺欺人的味道

#include <iostream>
using namespace std; 
 
int main(){
    const int MOU_NUM = 4;//老鼠数量
    int mouse[MOU_NUM] = {0};//老鼠状态,'0'为存活,'1'为死亡
    int drug = 0;//有毒瓶子号
    for (int i = 0; i < MOU_NUM; i++)
    {
        cin>>mouse[i];//输入老鼠喝水后的存活状态
    }
    for (int i = 0; i < MOU_NUM; i++)
    {
        drug |= (mouse[i] << (MOU_NUM - i - 1));//进行位运算
    }
    //判断是否有毒
    if (drug == 0)
    {
        cout<<"没有有毒的"<<endl;
    }
    else{
        cout<<"有毒的是第"<<drug<<"瓶";
        return 0;
    }
}

--------------------- 
作者:ZETTA_W 
来源:CSDN 
原文:https://blog.csdn.net/ZETTA_W/article/details/81128079 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/li198847/article/details/85936342