论坛首页 Java企业应用论坛

国王与100个囚犯

浏览 24055 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (6)
作者 正文
   发表时间:2010-08-04  
Crusader 写道
晕,你自己想想你被关进去后,第一天释放的是你,你知不知道?
看问题不能太死哦~


这一百人需要决定一个计数者~

只有计数者才可以开灯,其他的都只能对开着的灯进行且只能进行一次关闭操作

当计数者放出来时如果灯关闭了,则再打开,计数+1

最后也需要计数者宣布结束~~~

所以不考虑程序的局部变量或者全局变量,现实中确实需要决定一个计数者,可以不是第一个释放的,但必须是一百个人!

所以我觉得提问者的问题没有错~程序永远只是现实不完全的映射~
0 请登录后投票
   发表时间:2010-08-04  
sunson468 写道
Crusader 写道
晕,你自己想想你被关进去后,第一天释放的是你,你知不知道?
看问题不能太死哦~


这一百人需要决定一个计数者~

只有计数者才可以开灯,其他的都只能对开着的灯进行且只能进行一次关闭操作

当计数者放出来时如果灯关闭了,则再打开,计数+1

最后也需要计数者宣布结束~~~

所以不考虑程序的局部变量或者全局变量,现实中确实需要决定一个计数者,可以不是第一个释放的,但必须是一百个人!

所以我觉得提问者的问题没有错~程序永远只是现实不完全的映射~


一句话,没搞明白结束条件
0 请登录后投票
   发表时间:2010-08-04  
linghongli 写道

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

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


第一个问题,请仔细看思路和程序。。。

至于“可能有的人永远都没出去过”,有这种可能啊,这只能说明随机数序列生成有问题(也就是说产生随机数序列的方法是个笨蛋写的),而且题目要求的是囚犯自身如何确定100个囚犯都被放风过的思路
0 请登录后投票
   发表时间:2010-08-04  
Crusader 写道
linghongli 写道

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

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


第一个问题,请仔细看思路和程序。。。

至于“可能有的人永远都没出去过”,有这种可能啊,这只能说明随机数序列生成有问题(也就是说产生随机数序列的方法是个笨蛋写的),而且题目要求的是囚犯自身如何确定100个囚犯都被放风过的思路

程序中判断100个人都出去放风过的方法明显有问题
0 请登录后投票
   发表时间:2010-08-04  
哎,我发现很多人都喜欢砖牛角。。。

第一天的判断,请把题目中的囚犯也想成是真实的人,他们不是猪。。

至于为什么要第一个人来记数?当然也可以不,如果不指定第一个人的话(但必须在事前指定一个固定的囚犯),第一天的判断也可以取消,但是囚犯坐牢的天数将增加
0 请登录后投票
   发表时间:2010-08-04  
linghongli 写道
Crusader 写道
linghongli 写道

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

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


第一个问题,请仔细看思路和程序。。。

至于“可能有的人永远都没出去过”,有这种可能啊,这只能说明随机数序列生成有问题(也就是说产生随机数序列的方法是个笨蛋写的),而且题目要求的是囚犯自身如何确定100个囚犯都被放风过的思路

程序中判断100个人都出去放风过的方法明显有问题

很明显题目不完善,可楼主自己想当然啦。笨蛋写的随机会完全不放出去!?那聪明蛋写的随机就会全放出去了,说了完全随机,谁要求随机一定是要在100内随机,还是要在没出去的人那随机。好笑的很。
0 请登录后投票
   发表时间:2010-08-04  
Crusader 写道
哎,我发现很多人都喜欢砖牛角。。。

第一天的判断,请把题目中的囚犯也想成是真实的人,他们不是猪。。

至于为什么要第一个人来记数?当然也可以不,如果不指定第一个人的话(但必须在事前指定一个固定的囚犯),第一天的判断也可以取消,但是囚犯坐牢的天数将增加

还是那句话,你要用严谨的编程,那题目也要严谨,好么?不要别人说出题目的问题,你就这样,接受一下别人的想法,你要是题目很严谨了,谁跟你这钻牛角尖,是你自己的在钻牛角尖而已。
0 请登录后投票
   发表时间:2010-08-04  
Crusader 写道
哎,我发现很多人都喜欢砖牛角。。。

第一天的判断,请把题目中的囚犯也想成是真实的人,他们不是猪。。

至于为什么要第一个人来记数?当然也可以不,如果不指定第一个人的话(但必须在事前指定一个固定的囚犯),第一天的判断也可以取消,但是囚犯坐牢的天数将增加


选择一个计数人是没错的,至于是第几个都没关系,但判断结束的条件不明白,还请哪位高 手 指 点指点
0 请登录后投票
   发表时间:2010-08-04  
不指定第一天的人也行,下面是代码,但是不指定第一天的人作为记数员,坐牢天数不是最优

import java.util.Date;
import java.util.Random;

public class King_100Prisoner {
	
	// 记数器(由记数员囚犯用来计数囚犯放出去的人数)
	private int count;
	
	// 记数员囚犯编号
	private int counterman; 
	
	// 用来标记1到50编号的囚犯是否被放过风且关过灯
	private long _1_50 = 0;
	
	// 用来标记51到100编号的囚犯是否被放过风且关过灯
	private long _51_100 = 0;
	
	// 标识灯是否亮着
	private boolean isLightOn = false; 
	
	// 标记经过的天数
	private int day = 0;
	
	// 返回放风囚犯记数
	public int getCount(){
		return count;
	}
	
	// 返回经历的天数
	public int getDay(){
		return day;
	}
	
	// constructor
	public King_100Prisoner(boolean isLightOn, int counterman){
		this.isLightOn = isLightOn;
		this.counterman = counterman;
	}
	
	// 囚犯被放风
	public void releasePrisoner(int prisoner){

		// 放出不明生物
		if(prisoner>100 || prisoner<0){
			System.out.println("放出不明生物");
			return;
		}
		
		
		// 如果放风的是记数员
		if(prisoner == counterman){
			// 如果灯是关着的,将其打开,并且放风计数加1
			if(!isLightOn){
				isLightOn = true;
				count++;						
			}
			
		}else{ // 如果放风的是普通囚犯
			
			// 如果囚犯未关过灯
			if((prisoner&_1_50)==0 && (prisoner&_51_100)==0){
				
				// 第一次放风遇见灯开着,关灯,记录该囚犯放过风且关过灯
				if(isLightOn==true){
					isLightOn = false;
					
					if(prisoner<=50){
						_1_50 = _1_50 | (0x1L<<(prisoner-1));
					}else{
						_51_100 = _51_100 | (0x1L<<(prisoner-1));
					}
				// 遇见灯是关着的,什么也不做
				}else{
					// do nothing
				}
			// 如果囚犯已经关过灯	,什么也不做
			}else{
				// do nothing
			}
		}
		
		day++;	
	}
	
	public static void main(String[] args) {
		King_100Prisoner demo = new King_100Prisoner(true, 12);
		Random r = new Random(new Date().getTime());
		int prisoner = 0;
		while(demo.getCount()<100){
			prisoner = r.nextInt(100)+1;
			demo.releasePrisoner(prisoner);
		}
		System.out.println("需要"+demo.getDay()+"天");
	}

}
0 请登录后投票
   发表时间:2010-08-04   最后修改:2010-08-04
jammyjaccy 写道
linghongli 写道
Crusader 写道
linghongli 写道

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

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


第一个问题,请仔细看思路和程序。。。

至于“可能有的人永远都没出去过”,有这种可能啊,这只能说明随机数序列生成有问题(也就是说产生随机数序列的方法是个笨蛋写的),而且题目要求的是囚犯自身如何确定100个囚犯都被放风过的思路

程序中判断100个人都出去放风过的方法明显有问题

很明显题目不完善,可楼主自己想当然啦。笨蛋写的随机会完全不放出去!?那聪明蛋写的随机就会全放出去了,说了完全随机,谁要求随机一定是要在100内随机,还是要在没出去的人那随机。好笑的很。


随机的数字不在100内,请看程序是放出的什么?不明生物。
就算在题目中,你认为会放出不是囚犯的东西。
不能保证指定范围内的随机数都能够产生的随机算法,不是有问题的算法?这种算法就算是java之父写出来的,它也是笨蛋
0 请登录后投票
论坛首页 Java企业应用版

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