有 N个一模一样的瓶子,其中有 N-1瓶是普通的水,有一瓶是毒药。任何喝下毒药的生物都会在一星期之后死亡。问你需要有多少只小白鼠和一星期的时间,来检验出哪个瓶子里有毒药?怎么检验?编程实现检验过程。
编程思路:
设瓶子个数为N,根据我另一篇博文可知老鼠不能少于ceiling(log(N))只,首先编程得到老鼠的数量K,然后模拟老鼠吃药的过程,最后根据老鼠的死亡情况可以得到瓶子的编号。
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
/*
B中为true的那个是有毒的瓶子
*/
int findPoisonBottle(vector<bool> B) {
int index = 0, K = 0, size; //size临时存瓶子的数量 K是老鼠的数量
vector<bool> status;
size = B.size();
while(size) {
K++;
size >>= 1;
}
status.resize(K, false);
for(int i=0; i<B.size(); i++) {
int bottleIndex = i;
int mouseIndex = 0;
while(bottleIndex) {
//模拟老鼠喝药水的过程
if(bottleIndex & 0x1)
status[mouseIndex] = B[i] || status[mouseIndex];
bottleIndex >>= 1;
mouseIndex++;
}
}
//从老鼠死亡情况推出瓶子的编号
for(int i=1; i<=K; i++) {
index <<= 1;
if(status[K-i])
index |= 0x1;
}
return index;
}
int main() {
vector<bool> B(1000, false);
B[809] = true;
cout << findPoisonBottle(B) << endl;
return 0;
}