论坛首页 Java企业应用论坛

国王与100个囚犯

浏览 24062 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (6)
作者 正文
   发表时间:2010-08-04  
phyeas 写道
事实上,我觉得LZ的脑壳有问题,因为此题的先决条件是囚犯不知道时间,是不是第一天只有国王知道,你被关在一个封闭幽暗终日不见阳光的地方,你能知道过了几天吗?


你要这么死脑筋,我也没办法。你可以自己实验下,不看时钟的情况下,能否判断第一天,我反正行,我的生物种催使我绝对不会睡超过24小时
至于第一天后的日子,就根本不用判断了。。。我想你根本还没理解题目的意思
0 请登录后投票
   发表时间:2010-08-04  
jammyjaccy 写道
我觉得思路可以,但是还是有问题呀啊,因为第一个被放出去的人无法界定。
而且楼主写的程序时随机时间,我看题目怎么是随机门号呀。


Random r = new Random(new Date().getTime());
晕,你是说这句?。。这里new Date().getTime()只是作为产生随机数序列的种子。。。。
0 请登录后投票
   发表时间:2010-08-04   最后修改:2010-08-04
咱也来凑个热闹,groovy版:
def day = 0, counter = 0, bigBrother, prisoner, on, log = [:]
while(counter < 100) {
    prisoner = new Random().nextInt(100)
    if(day == 0) {
        bigBrother = prisoner       
    }
    day++
    if(on) {
        if(prisoner != bigBrother) {
            if(!log[prisoner]) {
                log[prisoner] = true
                on = false   
            }
        }
    } else {
        if(prisoner == bigBrother) {
            counter++
            on = true
            if(day == 1) {
                println "One prisoner(big brother himself) is out and in"
            } else {
                println "On day ${day}, when big brother is out seeing the light off, he is sure that ${counter} prisoners have been out and in"
            }
        }
    }
}
println "It took ${day} days(=${day/365} years)."
println "${day>365*30?'We\'re too old to go home(So is the King). We\'d rather stay here in prison until we die.':'Let\'s go home.'}"


其中的一次执行输出为:
One prisoner(big brother himself) is out and in
...
On day 10334, when big brother is out seeing the light off, he is sure that 100 prisoners have been out and in
It took 10334 days(=28.3123287671 years).
Let's go home.
0 请登录后投票
   发表时间:2010-08-04  
Crusader 写道
jammyjaccy 写道
我觉得思路可以,但是还是有问题呀啊,因为第一个被放出去的人无法界定。
而且楼主写的程序时随机时间,我看题目怎么是随机门号呀。


Random r = new Random(new Date().getTime());
晕,你是说这句?。。这里new Date().getTime()只是作为产生随机数序列的种子。。。。

哦,是这样,但是问题依旧呀,假定A是记录员被放出去了,可能不是第一天,但是,这个记录员到下次被放出去,他如何计数呢!?他怎么知道别人开关灯的情况以及哪些开关灯的人员是否是重复去的呢!?我觉得你这个程序里完全没有给出明确的界定。
0 请登录后投票
   发表时间:2010-08-04  
Crusader 写道
思路:
·选被关后第一天出去的囚犯作为特殊的计数员
·计数员被放出去,第一天将灯打开,今后每次放出去的时候,如果遇见灯是熄灭的,则将灯打开,并将记数加1
·而其他囚犯为普通囚犯,普通囚犯如果被放出去,在第一次遇见灯是打开的时候将其关闭(其他情况,即遇见灯是熄灭或第2,3,4..次遇见灯是开着的时候什么也不做)
=========================

思路里面不是说了么?囚犯在被关前的30分种商量,就已经说好了,谁第一个出去谁做计数的,大家各自按自己角色行事,我想是否为第一天被放风只要脑壳没问题,都能分辨出来

=============
100次中可能有些人关了几次呢

普通囚犯如果被放出去,在第一次遇见灯是打开的时候将其关闭(其他情况,即遇见灯是熄灭或第2,3,4..次遇见灯是开着的时候什么也不做) 。

=========

我觉得这个题目还是有问题,题目上很明确的说明了,每天随机放出,如果第一天放出的不是那个约定好的计数的人呢!?我认为这个100人中人人都有可能当计数员,但问题是商量的时候技数员是指定好的,是唯一的。
0 请登录后投票
   发表时间:2010-08-04  
log = [:]
不会groovy,这是数组吧,用来存囚犯是否关过灯的状态?
用数组记录有点奢侈,不过groovy里有没有位操作?
0 请登录后投票
   发表时间:2010-08-04  
Crusader 写道
log = [:]
不会groovy,这是数组吧,用来存囚犯是否关过灯的状态?
用数组记录有点奢侈,不过groovy里有没有位操作?


[:]是Map, []是List
有位操作,不过为了代码易读,用Map来标识。
0 请登录后投票
   发表时间:2010-08-04  
请LZ参考老帖子,第一天是不能界定的
0 请登录后投票
   发表时间:2010-08-04  

普通囚犯如果被放出去,在第一次遇见灯是打开的时候将其关闭(其他情况,即遇见灯是熄灭或第2,3,4..次遇见灯是开着的时候什么也不做) 。

第一个人怎么知道每个人都已经出去了呢,出去的人是随机产生的,可能有的人永远都没出去过
0 请登录后投票
   发表时间:2010-08-04  
linghongli 写道

普通囚犯如果被放出去,在第一次遇见灯是打开的时候将其关闭(其他情况,即遇见灯是熄灭或第2,3,4..次遇见灯是开着的时候什么也不做) 。

第一个人怎么知道每个人都已经出去了呢,出去的人是随机产生的,可能有的人永远都没出去过

严重同意,不严谨的题目要用严谨的编程来解决。没想通~~~呵呵
0 请登录后投票
论坛首页 Java企业应用版

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