用c++编写一个程序:有 100 个囚犯分别关在 100 间牢房里。牢房外有一个空荡荡的房间,房间里有一个由开

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

#include <iostream>
#include <ctime>
using namespace std;

int getNumber()
{
return (rand() % 100) ;
}
int main()
{
int day = 0;
int toggle = 0;//0表示灯关闭,1表示灯打开
int all[100] = { 0 };//100个犯人的状态,0表示没来过,1表示来过
int count = 0;//记录来过的犯人数量等于100时结束
srand(time(0));
while (count < 100)
{
int once = getNumber();//随机抽取犯人
if (all[once] == 0)//若之前没有来过
{
all[once ] = 1;
if (toggle == 0)//若关着灯那么打开通知其他人
{
toggle = 1;
}
count++;//来过的人数累加
}
else//如果已经来过了
{
if (toggle == 1)//若灯开着那么关闭它,保持灯是关闭状态
{
toggle = 0;
}
}
day++;//天数累加
}

cout << "需要: " << day << " 天" << endl;
system("pause");
}

/*
有 100 个囚犯分别关在 100 间牢房里。牢房外有一个空荡荡的房间,房间里有一个由开关控制的灯泡。
初始时,灯是关着的(或者随机)。看守每天随便选择一名囚犯进入房间,但保证每个囚犯都会被选中无穷多次。
如果在某一时刻,有囚犯成功断定出所有人都进过这个房间了,所有囚犯都能释放。
游戏开始前,所有囚犯可以聚在一起商量对策,但在此之后它们唯一可用来交流的工具就只有那个灯泡。
他们应该设计一个怎样的协议呢?请根据此协议设计实现一个程序,把解题过程详细输出并给出解题所需天数。
*/
/*
分析:灯泡只有两种状态:开启关闭,囚犯也有两种状态:来过没来过.
完全可以一一对应,囚犯没来过只会出现一次,而来过则会出现多次,
假定灯开始时是关闭着的,如果有囚犯没来过那么把灯打开,如果来过了那么保持灯的关闭状态(如果原来是开着的关闭它)
记录灯打开的次数如果等于100次说明都来过了那么结束
*/
温馨提示:内容为网友见解,仅供参考
第1个回答  2019-08-30
100个人协议好第一个进入房间的人当计数者,每个人(除计数者)通过开灯表示自己来过了,灯一旦打开,别人就不能关闭,只能等待计数者关闭。计数者关到第99次的时候,他就可以确定100个人都来过了。
实现代码如下:
#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() {
int days = 0;
srand(time(NULL));
flag = rand() % 2; // 初始灯的状态随机
counter = -1;
while (true)
{
int id = rand() % 100; // 每次随机一个人进入房间
put(id);
days++;
if (check())
break;
}
printf("所需天数:%d", days);
return 0;
}追问

Cannot open include file: 'bits/stdc++.h': No such file or directory
运行后提示错误,找不到这个头文件,大哥你是不是忘发了

追答

那就去掉该行,添加:
#include
#include

追问

ok,可以了

用c++编写一个程序:有 100 个囚犯分别关在 100 间牢房里。牢房外有...
有 100 个囚犯分别关在 100 间牢房里。牢房外有一个空荡荡的房间,房间里有一个由开关控制的灯泡。初始时,灯是关着的(或者随机)。看守每天随便选择一名囚犯进入房间,但保证每个囚犯都会被选中无穷多次。如果在某一时刻,有囚犯成功断定出所有人都进过这个房间了,所有囚犯都能释放。游戏开始前,所...

囚犯问题的博弈论是怎么样的啊?
有100个死囚,关在100个单人牢房,牢房排成一个圆圈。国王的特赦令是:每个囚犯早上必须在后窗挂起红旗或者黄旗。如果有连续100天,第k天只有第k间牢房挂起红旗,其他全是黄旗,就释放所有死囚。如果三年后还没完成,所有人全部拉出去砍了。囚犯可以先开一个会,会后所有人会被随机分到一间牢房,而且...

超级智力测试题:( ),( ),2,4,6,7,8 亲们~发挥你们的智慧~快来填填试
国王招来100个囚犯,对他们说:你们犯的是死罪,本应该将你们统统杀掉,但我慈悲为怀,给你们一次求生的机会。15分钟以后,你们将被关进一个有100间隔离牢房的监狱里,每人一间牢房,都与外界隔绝,什么也听不见、看不到,连时间都没法计算,更别说获得外界的任何信息。(送饭除外,但也是不规律的...

国王关的100个犯人如何得到释放?
首先在第一天,让所有犯人按秒数数,以此方法第一天放风的囚犯可以知道自己是第一个.然后,他出去后,让灯处于关着的状态, 第二个出去的人把灯打开,后面出去的人看到灯是开的不要关,等第一个人又被抽到第二次出去,将灯关掉,此时下一个出去的人看到灯是关的,他如果没有开过灯,打开;开...

什么是囚徒困境
囚徒困境是一个经典的博弈理论问题。囚徒困境是一个反映个人选择与集体利益冲突的游戏,通常用于揭示个体在决策时面临的困境。其情景通常设定如下:两个囚犯被捕并被分别关在两个独立的牢房里,不能相互交流。当局指控他们共同进行了一场犯罪并给出相同的证据。此时如果两个囚犯均否认罪行且不指控对方,他们...

...比如常用的称叫,狱警叫CO。还有监狱常有的规则或潜规则。_百度...
据统计,得州的监狱系统如此庞大,目前美国每9个犯人中就有一个关押在得州的监狱里。而且囚犯的人数每年都在增加。为了满足关押更多的囚犯的需要,该州自1980年以来已经建造了100多所监狱。该州预测,它的目标是能容纳15.5万名犯人,这将使它在监狱系统内成为美国之最。当记者问起伍兹这是否会给他带来麻烦时,他却不屑...

囚徒困境是什么意思???
囚徒困境(prisoner's dilemma)是指两个被捕的囚徒之间的一种特殊博弈,说明为什么甚至在合作对双方都有利时,保持合作也是困难的。在这个博弈中,参与者必须反复地选择他们彼此相关的策略,并且记住他们以前的对抗。阿克塞尔罗德邀请全世界的学术同行来设计计算机策略,并在一个重复囚徒困境竞赛中互相竞争。

智商难题,我就不信这里没高手
首先刚刚进入牢房可以确定的是:第一个被放风出来的人可以自我确定,因为刚开始大家的生物钟都是正常的。第一个人把灯打开(或关掉,如果关掉后面的顺序颠倒下就可以了)其他的人如果是第一次放风见到打开的灯全关掉,见到关着的灯不动。如果是第二次被放风,见到打开的灯不动,见到关着的灯就打开。...

《暗黑魔法师:崛起》游戏疑问
你先要拿尸体 走到尸体面前按 F 键 尸体变发光了是不?按 E 键就可以收集尸体了 然后走到石台(你一直跟着它跑那个)边再按E 把尸体就放上去了 看有操纵杆没 有就拉一下(也是E键拉)跟着石台回到有问号那个鬼那里 问号鬼面前有两只石头雕的鸡(作烤火状)是不是 靠问号鬼这只鸡身后有一个...

越狱什么时候上映第三季? 现在在拍摄当中吗?
Bellick走进牢房,就地坐下,没跟谁说话,也没人理他,因为本来就语言不通,他招呼michael进来,michael则停在了门口,打量着牢房内的情形,牢房大约十二三个平米,破陋不堪,阴冷潮湿,地上铺着稻草,一种猪圈里才有的气味扑鼻而来,没有床没有任何家具,没有盥洗台,只有五六个囚犯躲在角落盯着他看。“快进去,自动门一关...

相似回答