论坛首页 Java企业应用论坛

国王和100个犯人-

浏览 26013 次
该帖已经被评为新手帖
作者 正文
   发表时间:2010-01-15  
我鸡蛋里挑点骨头吧。。。
PS:我觉得对于这种需求不会变化的题目来说也没必要考虑什么扩展性。。。

1.计数员和普通囚犯 可以都为PRISONER的子类 这样就不必用IF来判断了
2.如果再要往下一步走对于普通囚犯来说分两种状态,
一种是开过灯,一种是没开过灯,用state模式整一下大概又可以少不少判断。
0 请登录后投票
   发表时间:2010-01-15  
hkliya 写道
myreligion 写道
在我看来,程序内出现System.out.println一般都在1年以内,或者只相当于一年以内。呵呵~~

可我这个是控制台程序啊,您的意思是输出写到文件?

用log4j啊。。。用System.out.println有不少缺点呢。比如:影响效率,浪费磁盘空间等。。。
0 请登录后投票
   发表时间:2010-01-15  
lzyzizi 写道
我鸡蛋里挑点骨头吧。。。
PS:我觉得对于这种需求不会变化的题目来说也没必要考虑什么扩展性。。。

1.计数员和普通囚犯 可以都为PRISONER的子类 这样就不必用IF来判断了
2.如果再要往下一步走对于普通囚犯来说分两种状态,
一种是开过灯,一种是没开过灯,用state模式整一下大概又可以少不少判断。

这个不是鸡蛋里挑骨头,说的很多。。技术员和普通囚犯就应该写成2个子类。。。
0 请登录后投票
   发表时间:2010-01-15  
li002qwe 写道
lzyzizi 写道
我鸡蛋里挑点骨头吧。。。
PS:我觉得对于这种需求不会变化的题目来说也没必要考虑什么扩展性。。。

1.计数员和普通囚犯 可以都为PRISONER的子类 这样就不必用IF来判断了
2.如果再要往下一步走对于普通囚犯来说分两种状态,
一种是开过灯,一种是没开过灯,用state模式整一下大概又可以少不少判断。

这个不是鸡蛋里挑骨头,说的很多。。技术员和普通囚犯就应该写成2个子类。。。

class(类) or  Type(类型)  ?
确实不是鸡蛋里挑骨头,楼主还没脱离一些结构化的思维。
面向对象的思想就是要解决现实事物
0 请登录后投票
   发表时间:2010-01-15  
装 13一大堆
0 请登录后投票
   发表时间:2010-01-15  
国王明显是耍你们的,还写程序 ……
0 请登录后投票
   发表时间:2010-01-15  
night_stalker 写道
国王明显是耍你们的,还写程序 ……

确实比较恼火,如果其中某个犯人挂掉的话,就全都出不来了
用这个算法,每个人被选中的机率是1%,计数员要被选接近100次,也就是大概要10000天左右
大概是27年,对于死囚来说,还是值得一试的
只不过这样的生活环境,估计心里素质不好的,都得抑郁症自杀了
0 请登录后投票
   发表时间:2010-01-15  
课程设计的题目吧。
0 请登录后投票
   发表时间:2010-01-15  
我是学生,我觉得你写的还没我写的好。所以你应该还没上大三,因为我今年大三。
贴上我的代码咱们交流交流。
package test;

public abstract class Prisoner {
	public static boolean light;
	public static int count;
	public static int day;
	static{
		//囚犯们唯一共有的通讯工具--灯
		light=false;
		//记录灯被计数员关掉的次数,也是出去过的囚犯数量
		count=0;
		//囚犯们在度过的天数
		day=0;
	}
	//记录囚犯有没有打开过灯
	boolean once;
	//囚犯出去放风
	public abstract void relieve();
}

package test;

public class Counter extends Prisoner{
	//计数员出去放风的时候,如果看见灯亮着,就关灯并计数
	public void relieve()
	{
		day++;
		if(light)
		{
			count++;
			light=false;
		}
	}
}

package test;

public class Ordinary_Prisoner extends Prisoner{
	//普通囚犯,构造时没有开过灯
	public Ordinary_Prisoner(){
		once=false;
	}
	//普通囚犯出去放风,第一次看见灯关着时就把灯打开,以后都不再开关灯
	public void relieve()
	{
		day++;
		if(!once&&!light){
			light=true;
			once=true;
		}
	}
}

package test;

import java.util.HashMap;
import java.util.Random;

public class King {
	//国王拥有一座监狱
	private HashMap<Integer,Prisoner> Prison;
	private Random random=new Random();
	
	public King()
	{
		//把100个囚犯放进监狱。其中有一个计数员和99个普通囚犯
		Prison=new HashMap<Integer,Prisoner>();
		Prisoner counter=new Counter();
		Prison.put(Integer.valueOf(0), counter);
		for(int i=1;i<100;i++)
		{
			Prisoner temp=new Ordinary_Prisoner();
			Prison.put(Integer.valueOf(i),temp);
		}
	}
	//国王随机挑选一个囚犯
	public Prisoner RandPick()
	{
		int r=random.nextInt(100);
		//System.out.println(r);
		Prisoner prisoner=Prison.get(Integer.valueOf(r));
		return prisoner;
	}
	
	public static void main(String[] args)
	{
		System.out.println("Run\n");
		King king=new King();
		//每天,国王随机挑选一个囚犯出去放风
		for(;;)
		{
			king.RandPick().relieve();
			System.out.println(Prisoner.count);
			//如果99个普通囚犯都出去过了
			if(Prisoner.count==99)
			{
				king.RandPick().relieve();
				System.out.println(Prisoner.day);
				System.out.println(new Integer(Prisoner.day).doubleValue()/365d);
				break;
			}
		}
	}
}

0 请登录后投票
   发表时间:2010-01-15  
我感到深深地自卑了
0 请登录后投票
论坛首页 Java企业应用版

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