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

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

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

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

  1. 0000 => 无毒
  2. 0001 => 1号瓶
  3. 0010 => 2号瓶
  4. 0011 => 3号瓶
  5. 0100 => 4号瓶
  6. 0101 => 5号瓶
  7. 0110 => 6号瓶
  8. 0111 => 7号瓶
  9. 1000 => 8号瓶
  10. 1001 => 9号瓶
  11. 1010 => 10号瓶
  12. 1011 => 11号瓶
  13. 1100 => 12号瓶
  14. 1101 => 13号瓶
  15. 1110 => 14号瓶
  16. 1111 => 15号瓶

将水喂给当前瓶子编号每一位为 '1' 的老鼠,例如第7号瓶子,则给第二只,第三只,第四只老鼠喂瓶子里面的水,最后观察老鼠的存活状态,来判断是哪一瓶,比如最后是 '1011' 则是11号瓶有毒。

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

#include 
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<<"没有有毒的"<

算法笔记——15个瓶子,4只老鼠,测试哪瓶有毒_第1张图片

算法笔记——15个瓶子,4只老鼠,测试哪瓶有毒_第2张图片

 

你可能感兴趣的:(算法笔记——15个瓶子,4只老鼠,测试哪瓶有毒)