锁定老帖子 主题:国王和100个犯人-
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-01-15
yilong511 写道 hkliya 写道 myreligion 写道 在我看来,程序内出现System.out.println一般都在1年以内,或者只相当于一年以内。呵呵~~
可我这个是控制台程序啊,您的意思是输出写到文件? 是不是用sysout有问题啊?不明白,,如果这样用不行,请指点一下。。。 因为我经常这样用呵,也好改正改正。。。 sysout没有问题,只不过常被开发人员用作检查代码状态用,如果项目做大的时候如果里存在这种语句或者e.printstack这类的效率会比较低,这一般是测试人员要考察和检查的地方。别被误导了,小程序用用sysout没问题的。 |
|
返回顶楼 | |
发表时间: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; } } } } |
|
返回顶楼 | |
发表时间:2010-01-15
l101y1982j 写道 小问一句,大三那位
能否将for(;;)改为while(true)呢? 请问for(;;)有什么不好的地方呢? |
|
返回顶楼 | |
发表时间: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(); } } |
|
返回顶楼 | |
发表时间: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); } } |
|
返回顶楼 | |
发表时间:2010-01-15
楼上的几年?
|
|
返回顶楼 | |
发表时间:2010-01-15
1年 没考虑那么多业务,只考虑功能了 类里边也就声明了几个有用的属性~
|
|
返回顶楼 | |
发表时间:2010-01-15
楼主快揭秘你工作几年了吧。哈哈
|
|
返回顶楼 | |
发表时间:2010-01-15
看了看大家的代码 感觉自己有很大的提升空间啊
|
|
返回顶楼 | |
发表时间:2010-01-15
zj1211 写道 先支持一下楼主,至少楼主能在编码中找到快乐。 顺便感叹一下,这年头直接使用JDK的提供的方法怎么就忒受人歧视,有必要言必称希腊吗。
建议以后放屁还是先脱裤子,再用食品袋罩住屁股。这样才是放屁经验超过1年的高手。因为: 1 比较环保,不会污染空气。 2 不会污染裤子,也就减少洗衣服的次数,也就等于为减少C排放做贡献 3 拉动了塑料袋的消费,为GDP增长做贡献 如此多的好处啊。 支持,就这么个小程序,用得着上纲上线吗? 重要的是心态,乐观,积极向上的心态最重要 |
|
返回顶楼 | |