论坛首页 Java企业应用论坛

国王和100个犯人-

浏览 25929 次
该帖已经被评为新手帖
作者 正文
   发表时间:2010-01-15  
yilong511 写道
hkliya 写道
myreligion 写道
在我看来,程序内出现System.out.println一般都在1年以内,或者只相当于一年以内。呵呵~~

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

是不是用sysout有问题啊?不明白,,如果这样用不行,请指点一下。。。
因为我经常这样用呵,也好改正改正。。。


sysout没有问题,只不过常被开发人员用作检查代码状态用,如果项目做大的时候如果里存在这种语句或者e.printstack这类的效率会比较低,这一般是测试人员要考察和检查的地方。别被误导了,小程序用用sysout没问题的。
0 请登录后投票
   发表时间:2010-01-15  
红楼一梦 写道
我是学生,我觉得你写的还没我写的好。所以你应该还没上大三,因为我今年大三。
贴上我的代码咱们交流交流。
package test;

public abstract class Prisoner {
	public static boolean light;
	public static int count; // 这个字段只有counter才有,为什么要放父类里呢?
	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  
l101y1982j 写道
小问一句,大三那位
能否将for(;;)改为while(true)呢?


请问for(;;)有什么不好的地方呢?
0 请登录后投票
   发表时间:2010-01-15   最后修改:2010-01-15
刚看了一下需求, 自己也就琢磨写了一下, 后面再看了楼主和楼下的, 深感自卑。
指点一下我的缺点。本人工作一年

//犯人类
public class Prisoner {

	protected int id; //犯人编号

	private boolean state = false; //犯人状态, 放过风的true, 没放过风的为false;
	
	public Prisoner(){}
	
	public Prisoner(int id){
		this.id = id;
	}
	
	/**
	 * @param light
	 * 开灯
	 */
	public void turnOn(Light light){
		light.turnOn();
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public boolean isState() {
		return state;
	}

	public void setState(boolean state) {
		this.state = state;
	}
	
}

//犯人计数人员
public class PrisonCounter extends Prisoner {
	
	private Counter count;
	
	public PrisonCounter(int id, Counter count){
		this.id = id;
		this.count = count;
	}
	
	/**
	 * @param light
	 * 关灯
	 */
	public void turnOff(Light light){
		light.turnOff();
	}
	
	public void addCount(){
		this.count.addCount();
	}
	
	public int getCount(){
		return this.count.getCount();
	}

}
//灯
public class Light {

	private boolean isLight = false;
	
	public void turnOn() {
		isLight = true;
	}

	public void turnOff() {
		isLight = false;
	}
	
	public boolean isLight(){
		return isLight;
	}

}
//计数器
public class Counter {
	
	private int count = 0;

	public void addCount() {
		count++;
	}

	public int getCount() {
		return this.count;
	}

}

//随机计数人员
public class RandomPointPrisonCount {
	
	int id;

	public RandomPointPrisonCount(Prisoner[] prisonArray){
		Random rd = new Random();
		int id = rd.nextInt(prisonArray.length);
		this.id = id;
	}
	
	public int getPrisonerCounterId(){
		return id;
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}

//测试类
public class Test {
	
	final int PRISONER_COUNT = 100; //犯罪总人数
	
	Prisoner[] prisonArray = new Prisoner[PRISONER_COUNT];//犯罪人容器
	
	Prisoner prisonCounter;
	
	/**
	 * 初始化 
	 */
	public void init(){
		initPrison();
		PointPrisonCount();
	}
	
	/**
	 *	初始化罪犯 
	 */
	public void initPrison(){
		for(int i = 0; i < PRISONER_COUNT; i++){
			Prisoner prison = new Prisoner(i);
			prisonArray[i] = prison;
		}
	}
	
	/**
	 * 随机指定计数员
	 */
	public void PointPrisonCount(){
		RandomPointPrisonCount rppc = new RandomPointPrisonCount(prisonArray);//随机产生一个计数员
		Prisoner prison = new PrisonCounter(rppc.id, new Counter());
		prisonArray[rppc.id] = prison;
		prisonCounter = prison;
		System.out.println("当前计数员为:" + rppc.id);
	}
	
	public void runGame(){
		Light light = new Light();
		int day = 0;
		PrisonCounter counter = (PrisonCounter)prisonCounter;
		while(counter.getCount() < PRISONER_COUNT -1){
			Random rm = new Random();
			int id = rm.nextInt(PRISONER_COUNT);
			if(id == prisonCounter.id){//如果是计数员出来,灯亮就关闭
				if(light.isLight){
					counter.turnOff(light);
					counter.addCount();
				}
			}else{
				if(!light.isLight){
					if(!prisonArray[id].state){
						prisonArray[id].turnOn(light);
						prisonArray[id].state = true;
					}
				}
			}
			
			day++;
		}
		System.out.println("一共花了" + day + "天, 人员全部出狱!");
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Test test = new Test();
		test.init();
		test.runGame();
	}

}


0 请登录后投票
   发表时间:2010-01-15   最后修改:2010-01-15
100行不到,包括空行等
//灯类
public class Light
{
    private boolean isOn; //开关 默认开

    public Light()
    {
        this.isOn = true;
    }

    public boolean isOn()
    {
        return isOn;
    }

    public void setOn(boolean isOn)
    {
        this.isOn = isOn;
    }
}

//囚犯,不包括计数员
public class Prisoner
{
    private boolean isOnLight; //是否关过灯

    public Prisoner()
    {
        this.isOnLight = false;
    }

    public boolean isOnLight()
    {
        return isOnLight;
    }

    public void setOnLight(boolean isOnLight)
    {
        this.isOnLight = isOnLight;
    }
}

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

public class StartGame
{
    private static Map<Integer, Prisoner> pMap = new HashMap<Integer, Prisoner>();

    private static Random rd = new Random();

    static
    {
        Prisoner ps;
        for (int i = 0; i < 99; i++) //第99的位置留给计数员
        {
            ps = new Prisoner();
            pMap.put(i, ps);
        }
    }

    public static void main(String[] args)
    {
        int count = 0;
        int dayCount = 0;
        Light lt = new Light();
        while (true)
        {
            dayCount++;
            int num = rd.nextInt(100);
            if (num == 99)
            {
                lt.setOn(true);
                continue;
            }
            Prisoner ps = pMap.get(num);
            if (!ps.isOnLight() && lt.isOn())
            {
                count++;
                ps.setOnLight(true);
                lt.setOn(false);
            }
            if (count == 99)
            {
                break;
            }
        }
        System.out.println(dayCount);
        System.out.println(dayCount / 365);
    }
}
0 请登录后投票
   发表时间:2010-01-15  
楼上的几年?
0 请登录后投票
   发表时间:2010-01-15  
1年  没考虑那么多业务,只考虑功能了  类里边也就声明了几个有用的属性~
0 请登录后投票
   发表时间:2010-01-15  
楼主快揭秘你工作几年了吧。哈哈
0 请登录后投票
   发表时间:2010-01-15  
看了看大家的代码   感觉自己有很大的提升空间啊
0 请登录后投票
   发表时间:2010-01-15  
zj1211 写道
先支持一下楼主,至少楼主能在编码中找到快乐。 顺便感叹一下,这年头直接使用JDK的提供的方法怎么就忒受人歧视,有必要言必称希腊吗。

  建议以后放屁还是先脱裤子,再用食品袋罩住屁股。这样才是放屁经验超过1年的高手。因为:
1 比较环保,不会污染空气。
2 不会污染裤子,也就减少洗衣服的次数,也就等于为减少C排放做贡献
3 拉动了塑料袋的消费,为GDP增长做贡献

如此多的好处啊。



支持,就这么个小程序,用得着上纲上线吗?
重要的是心态,乐观,积极向上的心态最重要
0 请登录后投票
论坛首页 Java企业应用版

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