美文网首页
100个犯人与灯泡

100个犯人与灯泡

作者: 章开晴 | 来源:发表于2018-09-05 19:37 被阅读70次

有 100 个囚犯分别关在 100 间牢房里。牢房外有一个空荡荡的房间,房间里有一个由开关控制的灯泡。初始时,灯是关着的(或者随机)。看守每天随便选择一名囚犯进入房间,但保证每个囚犯都会被选中无穷多次。如果在某一时刻,有囚犯成功断定出所有人都进过这个房间了,所有囚犯都能释放。游戏开始前,所有囚犯可以聚在一起商量对策,但在此之后它们唯一可用来交流的工具就只有那个灯泡。他们应该设计一个怎样的协议呢?请根据此协议设计实现一个程序,把解题过程详细输出并给出解题所需天数。

这个题目挺有意思的,建议自己先独立思考一下然后再看下面的解答

Hint

相当于每个人都只有一个小球,那个房间是一个只能放下一个小球的盒子,每个人将自己的小球放入盒子,计数者负责把每个小球收走并计数,如果收到小球的数量达到了99个,就说明每个人都进入过了这个房间

代码实现

#include <bits/stdc++.h>
using namespace std;

int counter, cnt;
bool vis[100];
bool flag;
void put(int id) {
    if (counter == -1) {
        counter = id; // 第一个进入房间的人当计数者
        flag = 0; // 将灯恢复关闭状态
        return;
    }
    if (id == counter && flag) {
        // 只有计数者将灯关闭并计数
        flag = 0;
        ++cnt;
    }
    if(id != counter && !flag && !vis[id]) {
        // 非计数者第一次见到灯灭时,将灯打开
        vis[id] = 1;
        flag = 1;
    }
}

bool check() {
    // 检查是否所有人都进入了房间
    return cnt == 99;
}

int main() {
    srand(time(NULL));
    flag = rand() % 2; // 初始灯的状态随机
    counter = -1;
    while (true)
    {
        int id = rand() % 100; // 每次随机一个人进入房间
        put(id);
        if (check()) 
            break;
    }
    return 0;
}

如果假设不知道进入房间的人不知道是第几天,则可以随便指定一个人作为计数者,然后其他每个人都有两个小球(即两次机会将灯打开),那么计数者最多收到的小球个数要么是198个小球或者199个小球,那么也就是说,当计数达到了198就可以认定为每个人都至少一次到过了这个房间,就避免了初始状态未知不定带来的干扰

参考资料
100 Prisoners and A light Bulb
100个囚犯和灯泡的那些事儿 - Matrix67

相关文章

  • 100个犯人与灯泡

    有 100 个囚犯分别关在 100 间牢房里。牢房外有一个空荡荡的房间,房间里有一个由开关控制的灯泡。初始时,灯是...

  • 犯人与男孩

    我坐在井岸路边的鱼蛋档里,旁边的车流很多,但没人往这边瞥哪怕一眼。 鱼蛋不贵,八块十粒。 ...

  • 小偷与犯人

    小敏下班闺蜜约了她吃饭散心。闺蜜家离地铁十分钟路程,时间还早,她准备慢慢悠过去,一边走一边刷手机。 突然,她感到包...

  • 犯人不犯人

    母亲最后的遗书:钥匙在窗台上,钥匙在窗台的阳光里。孩子,结婚吧,不要吸毒。钥匙就在那阳光里。 1️⃣ 刚出狱的他为...

  • 优化自己,才有脱颖而出的光芒

    01 前几天,我房间里的灯泡坏了。爸爸在帮我换一个新的灯泡。 与坏掉的灯泡相比,这个新灯泡明显较大,乳白色的,有点...

  • 监狱里来了一群人妖(上)

    近期中队要新收一批特殊的犯人,每月都要接收罪犯,犯人与犯人之间除了罪名不同,身高年龄不同,还能有哪些特殊? “红兵...

  • 【飞蛾与灯泡】

    一只飞蛾在看着灯泡, 啪,灯泡一下子灭了。 我说有什么好害羞的。 灯泡说我不是火, 我怕耽误了人家。 后来每夜灯泡...

  • 灯泡与蛾子

    分享一个小故事 小阁楼里那个灯泡灭了,我拿下来仔细翻看检查了一下,发现钨丝并没有断。 我重新按下开关, 灯泡闪了两...

  • 灯泡与探照灯

    同样是3瓦功率,灯泡只能把房间微微照亮,而手电筒却能照清东西。 这段时间学了用故事思维提升说服力,在最后一课李南南...

  • 犯人

    朋友之间,要是看到了剃了个光头,就会调侃他是不是刚从号子里就来,因为在我们印象中,进监狱的人,不管是犯了什么罪,都...

网友评论

      本文标题:100个犯人与灯泡

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