美文网首页算法
有趣的老鼠找毒瓶算法

有趣的老鼠找毒瓶算法

作者: Alfred_小乐 | 来源:发表于2018-11-22 17:15 被阅读21次

先看下题目:有15个瓶子,瓶子中都装有水,但是其中有一个瓶子的水是有毒的,现在有4只老鼠,老鼠喝了有毒的水后会在第二天死亡,如何设计老鼠喝水可以再第二天通过观察老鼠的状态来判断哪个瓶子的水有毒?

分析一下题目:每瓶水对于每只老鼠来说都有喝或者不喝两种状态,4只老鼠对于每瓶水都可以有 0000 -> 1111 16中状态,由于要确认有毒,所以舍弃掉第一种都不喝的状态(0000),剩余15中状态正好与15个瓶子一一对应,所以我们可以取瓶子编号的后4位(0001->1111)来对应4只,老鼠是否喝这瓶水的状态 0代表喝 1代表不喝,最后根据4只老鼠的中毒状态来代表4个bits就可以得到哪个瓶子有毒了。

理清了思路,就可以用代码验证一下了:

先根据题目创建老鼠和瓶子的类


@interface BottleWater : NSObject
// 是否有毒
@property (nonatomic,assign) BOOL poisonous;
@property (nonatomic,assign) NSUInteger num; // 编号
@end
@implementation BottleWater
-(NSString *)description
{
    return [NSString stringWithFormat:@"%lu号瓶子,%@毒",_num,_poisonous?@"有":@"无"];
}
@end

@interface Mouse : NSObject
// 是否中毒
@property (nonatomic,readonly,assign) BOOL poisoning;
@property (nonatomic,assign) NSUInteger num;// 编号
@property (nonatomic,readonly,getter=nextDayStatus) BOOL isLiving;
@end
@implementation Mouse
@synthesize poisoning = _poisoning;

- (void)drinkWater:(BottleWater *)water
{
    if (water.poisonous) {
        _poisoning = YES;
    }
}
- (BOOL)nextDayStatus
{
    return !_poisoning;
}
-(NSString *)description
{
    return [NSString stringWithFormat:@"%lu号老鼠%@中毒",_num,_poisoning?@"":@"未"];
}
@end

然后根据思路设计代码:
首先创建瓶子和老鼠

        // 创建瓶子
        NSMutableArray <BottleWater *>*waters = [NSMutableArray arrayWithCapacity:1];
        int poisoningNum = arc4random()%15+1;
        NSLog(@"第%d瓶有毒",poisoningNum);
        for (int i=1; i<=15; i++) {
            BottleWater *water = [[BottleWater alloc] init];
            water.num = i;
            if (i == poisoningNum) {
                water.poisonous = YES;
            }
            [waters addObject:water];
        }
        // 创建老鼠
        NSMutableArray <Mouse *>*mouses = [NSMutableArray arrayWithCapacity:1];
        for (int i=1; i<=4; i++) {
            Mouse *mouse = [[Mouse alloc] init];
            mouse.num = i;
            [mouses addObject:mouse];
        }

用瓶子的编码的后4位的每一位分别代表每个老鼠是否喝此瓶水

        for (UInt8 i=1; i<=waters.count; i++) {
            UInt8 index1,index2,index3,index4;
            // 取位
            index1 = i & 1; // 第一个老鼠是否喝
            index2 = i & 2; // 第二个老鼠是否喝
            index3 = i & 4; // 第三个老鼠是否喝
            index4 = i & 8; // 第四个老鼠是否喝
            if (index1) {
                [mouses[0] drinkWater:waters[i-1]];
            }
            if (index2) {
                [mouses[1] drinkWater:waters[i-1]];
            }
            if (index3) {
                [mouses[2] drinkWater:waters[i-1]];
            }
            if (index4) {
                [mouses[3] drinkWater:waters[i-1]];
            }
        }

水已喝完,验证一下是否找对有毒的瓶子

        // 假设一天后
        UInt8 number = 0; // 有毒的瓶子
        for (UInt i=0; i<mouses.count; i++) {
            NSLog(@"%@",mouses[i]);
            UInt8 j = mouses[i].isLiving ? 0 : 1 << i;
            number |= j;
        }
        NSLog(@"-------------------");
        NSLog(@"有毒的瓶子编号是:%d",number);

打印如下

2018-11-22 17:08:42.042593+0800 Demo[1686:108521] 第10瓶有毒
2018-11-22 17:08:42.042883+0800 Demo[1686:108521] 1号老鼠未中毒
2018-11-22 17:08:42.042937+0800 Demo[1686:108521] 2号老鼠中毒
2018-11-22 17:08:42.042961+0800 Demo[1686:108521] 3号老鼠未中毒
2018-11-22 17:08:42.042974+0800 Demo[1686:108521] 4号老鼠中毒
2018-11-22 17:08:42.042983+0800 Demo[1686:108521] -------------------
2018-11-22 17:08:42.042999+0800 Demo[1686:108521] 有毒的瓶子编号是:10

Demo

相关文章

  • 有趣的老鼠找毒瓶算法

    先看下题目:有15个瓶子,瓶子中都装有水,但是其中有一个瓶子的水是有毒的,现在有4只老鼠,老鼠喝了有毒的水后会在第...

  • 一道有趣的面试题(第一个回答正确的赠送5贝)

    现在有16瓶药水,其中只有一瓶有毒,老鼠只要喝一滴就会在1h后会准时死亡,药水无色无味,如何用最少的老鼠在1h内找...

  • 笔试/面试题

    老鼠和毒酒问题:1000瓶酒其中1瓶有毒,用10只老鼠找出毒酒。解题方法1:折半查找法。取500瓶内各一滴,看老鼠...

  • 有趣的老鼠

    今天画了一个老鼠 硕大无比 看来的确是没有画画的天赋 就这样自得其乐吧

  • 关于1000个瓶子10只老鼠的算法问题

    问题 现有1000瓶药,其中有一瓶毒药,喝了之后1小时后才产生效果,现在你有10只老鼠和1个小时的时间,请问怎么找...

  • 老鼠试毒

    题目:有100瓶矿泉水,但是其中一瓶里面是有剧毒的,老鼠喝了有毒药的水一周后就会死亡,请问一周后要知道具体哪瓶水是...

  • 3月5日

    老鼠姑娘长大了,老鼠爸爸妈妈想把老鼠姑娘嫁出去,可是嫁给谁呢?老鼠妈说要把老鼠姑娘嫁给世界上最厉害的。他们找呀找,...

  • 绘本讲师训练营【23期】2/21阅读原创《小老鼠找新家》

    22012郭彩霞 今天我读的是特别有趣的一本洞洞书《小老鼠找新家》,有一天小老鼠发现一个又大又红的苹果,他好想把这...

  • 算法智力题-老鼠测验哪瓶是毒药

    题目描述 给定99瓶水和1瓶毒药,假定老鼠喝完毒药要一周后才发作,问在一周后要确定哪瓶是毒药,至少需要多少只老鼠 ...

  • 老公的养生之道

    平时吃的毒还不够,还要抹点毒,喝点毒!这句话是我老公说我的,嫌每天吃得菜米食物激素农药化肥还不够,还天天抹些瓶瓶罐...

网友评论

    本文标题:有趣的老鼠找毒瓶算法

    本文链接:https://www.haomeiwen.com/subject/fqtrqqtx.html