论坛首页 Java企业应用论坛

国王和100个囚犯

浏览 36069 次
精华帖 (0) :: 良好帖 (10) :: 新手帖 (0) :: 隐藏帖 (8)
作者 正文
   发表时间:2010-01-14  
好神奇啊...看了不错..
0 请登录后投票
   发表时间:2010-01-14  
langshao 写道
中国大人 写道
langshao 写道
中国大人 写道
langshao 写道
中国大人 写道
kukuwuwu 写道
langshao 写道
kukuwuwu 写道
我觉得这应该是个逻辑题,结果应该是一个方案, 而不是多少天能出来
可以这样,
1. 指定100其中的一个人来做管理员
2. 管理员第一次出来放风时候把灯打开
3. 其他人放风的时候, 如果自己是第一次出来 看灯的状态,如果是亮的,那么关闭它
4. 其他人如果不是第一次出来,不改变灯的状态,关着就让它关着,开着就让它开着
5. 如果第一次出来的时候 灯为关闭状态, 那么不改变状态,并且当自己没出来,下次出来仍然是第一次出来
6. 当管理员再次出来时候如果灯是关闭的 说明除他之外有一个人放出来了 心中的计数器加1, 并把灯打开, 如果灯是开着的,说明除他之外没有人出来过, 不做任何操作


如果灯一开始就是关着的,管理员如何确定是否有人出来过?

算多少天只是好奇一般情况下他们还能不能活着出来

如果灯一开始关着的, 管理员就当一个人都没出来过, 其他人第一次出来时 灯是关着的  也当自己没出来过,见弟5条

kukuwuwu正解,没看出漏洞来.


我实在看不明!
3-5是不是说“第一次看到灯开就关”?
第2条,如果管理员第一次出来看到灯是开着的,怎办?
其他人都在管理员第一次出来之后才出来?

管理员第一次出来开到灯是开着的,不管,让它开着.直到有一次看到灯是关闭的为止.计数,打开灯.等待下一次的关闭.

就是其他犯人看到灯是开的,关了?
那么,如果刚开始灯就是开的,其他犯人关,还是不关?他们能知道管理员出来过吗?

刚开始的时候灯开的,犯人关掉.不论什么情况下,只要管理员确定是他自己开的灯,以后的某一次看到灯关掉了,他就可以记一次数.

哦,这样管理员确实知道从什么时候开始计数。按你的说法,管理员不记之前的人数。那么,关灯那位兄弟,他怎么知道下次还要不要关灯呢?管理员可还没有算上他啊!

哎呀,对哈,遗漏了,继续想ing....
0 请登录后投票
   发表时间:2010-01-14  
什么也看不到,听不到,连时间都感觉不到,吃饭也没点儿。。。唯一的娱乐就是不定期的去院子里玩那不知道被多少人玩过的破灯。。。
要是我是犯人,不是prison break就是咬舌自尽,一了百了,谁跟这无聊又变态的国王烂人玩这破游戏。。。

照这个游戏规则玩,估计出去的时候国王都已经死了,找谁说理去。。。
0 请登录后投票
   发表时间:2010-01-14  
hkliya 写道
什么也看不到,听不到,连时间都感觉不到,吃饭也没点儿。。。唯一的娱乐就是不定期的去院子里玩那不知道被多少人玩过的破灯。。。
要是我是犯人,不是prison break就是咬舌自尽,一了百了,谁跟这无聊又变态的国王烂人玩这破游戏。。。

照这个游戏规则玩,估计出去的时候国王都已经死了,找谁说理去。。。



如果是10个犯人呢?一般在一年内就能出去了(概率大于99%)!
0 请登录后投票
   发表时间:2010-01-14  
kukuwuwu 写道
langshao 写道
中国大人 写道
langshao 写道
中国大人 写道
langshao 写道
中国大人 写道
kukuwuwu 写道
langshao 写道
kukuwuwu 写道
我觉得这应该是个逻辑题,结果应该是一个方案, 而不是多少天能出来
可以这样,
1. 指定100其中的一个人来做管理员
2. 管理员第一次出来放风时候把灯打开
3. 其他人放风的时候, 如果自己是第一次出来 看灯的状态,如果是亮的,那么关闭它
4. 其他人如果不是第一次出来,不改变灯的状态,关着就让它关着,开着就让它开着
5. 如果第一次出来的时候 灯为关闭状态, 那么不改变状态,并且当自己没出来,下次出来仍然是第一次出来
6. 当管理员再次出来时候如果灯是关闭的 说明除他之外有一个人放出来了 心中的计数器加1, 并把灯打开, 如果灯是开着的,说明除他之外没有人出来过, 不做任何操作


如果灯一开始就是关着的,管理员如何确定是否有人出来过?

算多少天只是好奇一般情况下他们还能不能活着出来

如果灯一开始关着的, 管理员就当一个人都没出来过, 其他人第一次出来时 灯是关着的  也当自己没出来过,见弟5条

kukuwuwu正解,没看出漏洞来.


我实在看不明!
3-5是不是说“第一次看到灯开就关”?
第2条,如果管理员第一次出来看到灯是开着的,怎办?
其他人都在管理员第一次出来之后才出来?

管理员第一次出来开到灯是开着的,不管,让它开着.直到有一次看到灯是关闭的为止.计数,打开灯.等待下一次的关闭.

就是其他犯人看到灯是开的,关了?
那么,如果刚开始灯就是开的,其他犯人关,还是不关?他们能知道管理员出来过吗?

刚开始的时候灯开的,犯人关掉.不论什么情况下,只要管理员确定是他自己开的灯,以后的某一次看到灯关掉了,他就可以记一次数.

哦,这样管理员确实知道从什么时候开始计数。按你的说法,管理员不记之前的人数。那么,关灯那位兄弟,他怎么知道下次还要不要关灯呢?管理员可还没有算上他啊!

哎呀,对哈,遗漏了,继续想ing....

确实灯的初始状态非常重要,之前考虑的时候没有想清楚,以为可以忽略第一次,仔细想下,有种情况如果忽略了第一次那么就永远都达不到99次了。。
0 请登录后投票
   发表时间:2010-01-14  
hkliya 写道
什么也看不到,听不到,连时间都感觉不到,吃饭也没点儿。。。唯一的娱乐就是不定期的去院子里玩那不知道被多少人玩过的破灯。。。
要是我是犯人,不是prison break就是咬舌自尽,一了百了,谁跟这无聊又变态的国王烂人玩这破游戏。。。

照这个游戏规则玩,估计出去的时候国王都已经死了,找谁说理去。。。

你要是咬舌自尽了,那个计数员数到98的时候就杯具了。。。99永远不会来了
0 请登录后投票
   发表时间:2010-01-15   最后修改:2010-01-15
import java.util.Random;

import java.util.Random;

public class Perisoner {

private boolean lightOn;
private int sum = 100;// 总人数
private boolean[] isOut = new boolean[sum];// 记录每个囚犯是否放过风
private final int counterId = 0;// 计数人id;
private int count = 0;// 计数次数
private int days = 0;
private Random rand = new Random();
private final boolean primaryLightOn; //灯的最初是否亮着

public Perisoner() {
this.lightOn = rand.nextBoolean();// 随机生成灯的初始状态
this.primaryLightOn = lightOn;
}

public void out() {
while (true) {
int id = rand.nextInt(sum);
days++;

if (isOut[id]) {// 如果已经出去过
continue;
}

if (id == counterId) {// 如果是计数人
if (!lightOn) {
lightOn = true;
count++;
}

} else {// 如果不是计数人
if (lightOn) {
lightOn = false;
isOut[id] = true;
}
}

/*
*如果灯最初是开着的,计数 sum-1次终止 ---问题就在这里!!
*/
if (primaryLightOn && (count == sum - 1)) {
break;
}

/*
* 如果灯最初是关着的,计数sum次终止
*/
if (count == sum) {
break;
}

}
}

public int getDays() {
return days;
}

public static void main(String[] args) {
Perisoner p = new Perisoner();
System.out.println("灯最初状态:" + p.lightOn);
p.out();
System.out.println("总天数" + p.getDays());
}

}


==========

计数人只能开灯,普通囚犯只能关灯,并且只能关一次;
如果灯最初是关着的,普通囚犯必须等计数人把等打开才能操作,计数人需要开灯 1+99 次才能确定
如果灯最初是开着的,普通囚犯可以直接把他关闭,计数人只需要开灯 99 次即可,并且不可能再有第100次

这样计算,结果是10000天左右

==========


但问题出在,如果囚犯不知道最初灯是开是关,计数人就不知道要计数 99次,还是100次!!

只能按100次算,但是,如果灯最初就是亮着的,他最多计只能数到 99次,这样他们死定了!!
0 请登录后投票
   发表时间:2010-01-15  
lolopig 写道
我的理解是记数员是不是第一个出去的没有关系,灯的初始状态也没有关系。
记数员自己第一次出去发现灯是关的,那么99次就可以了。
如果记数员第一次出去发现灯是开的,那么为了保证万无一失,多记数一次就可以了。



灯的初始状态肯定有关系

如果技术员第一发现灯是关着的,他如何知道是被别的囚犯关闭的 还是本来灯就关闭?
如果被别的囚犯关闭,他最多只能打开99次,
如果灯初始状态就是关闭,他能打开100次!
0 请登录后投票
   发表时间:2010-01-15  
既然不知道第一次是不是OK的,那么就循环两次,记录198次就可以了。

如果第一次记录是对的,那么理应会有99*2=198次。

如果第一次记录是错的,那么理应会到99*2+1=199次,但是记录198次也就可以了,因为这时囚犯都已经出去过了,只不过有一个囚犯出去一次罢了。
0 请登录后投票
   发表时间:2010-01-15  
我的策略是:计数囚犯开了几次就算曾出去过多少人,到100为止,其他囚犯只管关

如果灯一开始是关的,其他囚犯先出去也不会有动作,从计数囚犯开灯开始,计数囚犯开第100次灯的时候就可以确定100人都出来了(因为有99次灯被其他囚犯熄灭了,最后一个是他自己)。

如果灯一开始是亮的,
若第一个出来的是计数囚犯,就当作是自己开灯,计数+1。
若第一个出来的是其他囚犯,直接熄灭,之后就和灯初始是关的一样……
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics