国王和100个囚犯
一道益智题:
国王招来100个囚犯,对他们说:你们犯的是死罪,本应该将你们统统杀掉,但我慈悲为怀,给你们一次求生的机会。15分钟以后,你们将被关进一个有100间隔离牢房的监狱里,每人一间牢房,都与外界隔绝,什么也听不见、看不到,连时间都没法计算,更别说获得外界的任何信息。(送饭除外,但也是不规律的送)
这所监狱有一个院子,每天会随机(注意是完全随机)打开一间牢房的门,让那个囚犯到院子里来放风。院子里有一盏路灯,放风的囚犯可以控制它的开关,将它打开或是关闭。除囚犯之外,其他人都不会去碰开关。这盏灯会永远有充足的能源供应,如果灯泡坏了或是电路出了故障会马上修好,当然修理人员不会改变灯的状态(开或关)。
除了开关这盏灯,放风的囚犯放风时留下的任何其它痕迹都会在夜晚被清除干净(包括在灯上作的任何记号)。
牢房是完全封闭的,院子里的灯光在牢房里看不到。只有放风出到院子里的人才能看到。
好了现在我向你们提出一个要求,只要你们做到了,就可以全部获得释放: 若干天以后,你们中只要有任何一个人能够向我证明所有的人都曾到院子里去过,你们就全体释放。当然要有证据!因为我只会给你们一次机会,如果向我证明的那个人无法自圆其说,你们就全部砍头。所以,要珍惜这次机会。如果你们永远做不到我的要求,你们就全部关到死。
现在给你们15分钟商量你们的方案。15分钟以后,你们将被关进我刚才说的那个监狱,永远无法再交流。
我测试出来的结果是
总共花费27年82天
总共花费26年358天
总共花费28年60天
总共花费22年276天
总共花费27年152天
总共花费31年251天
总共花费28年282天
总共花费28年214天
总共花费32年156天
总共花费31年296天
真是群可怜的娃子 - -……
顺便贴个代码,首先是灯:
package org.yoyo.prison;
/**
* 灯
* @author YOYO
*
*/
public class Light {
/**
* 状态
*/
private boolean state = false;
public void changeState(boolean state) {
if (state) {
System.out.println("点亮了灯");
} else {
System.out.println("熄灭了灯");
}
this.state = state;
}
public boolean getState() {
return this.state;
}
}
然后是囚犯:
package org.yoyo.prison;
/**
* 囚犯
* @author YOYO
*
*/
public abstract class Prisoner {
protected int prisonerId;
public Prisoner(int prisonerId) {
this.prisonerId = prisonerId;
}
/**
* 询问
*/
public abstract boolean wantProve();
/**
* 改变灯的状态
*/
public abstract void changeLightState(Light light);
}
普通囚犯:
package org.yoyo.prison;
/**
* 普通囚犯
* @author YOYO
*
*/
public class OrdinaryPrisoner extends Prisoner {
private boolean doFlag = false;
public OrdinaryPrisoner(int prisonerId) {
super(prisonerId);
}
@Override
public void changeLightState(Light light) {
if (light.getState() && !doFlag) {
doFlag = true;
light.changeState(false);
} else {
System.out.println("不做任何操作");
}
}
@Override
public boolean wantProve() {
return false;
}
}
计数的囚犯:
package org.yoyo.prison;
/**
* 计数囚犯
* @author YOYO
*
*/
public class CounterPrisoner extends Prisoner {
/**
* 计数
*/
private int count = 0;
/**
* 囚犯总数
*/
private int total;
public CounterPrisoner(int prisonerId, int total) {
super(prisonerId);
this.total = total;
}
@Override
public void changeLightState(Light light) {
if (light.getState() == false) {
++count;
light.changeState(true);
} else {
System.out.println("不做任何操作");
}
}
@Override
public boolean wantProve() {
return count == total;
}
}
测试:
package org.yoyo.prison;
public class TestMain {
private final static int NUMBER = 100;
public static void main(String[] args) {
Light light = new Light();
Prisoner[] prisoners = new Prisoner[NUMBER];
prisoners[0] = new CounterPrisoner(0, NUMBER);
for (int i = 1; i < NUMBER; ++i) {
prisoners[i] = new OrdinaryPrisoner(i);
}
int times = 0;
while (true) {
++times;
int num = (int) (Math.random() * NUMBER);
System.out.print(num + "号囚犯 ");
prisoners[num].changeLightState(light);
if (prisoners[num].wantProve()) {
System.out.println(NUMBER + "个囚犯已经都出去过一次!");
break;
}
}
System.out.println("总共花费" + times / 365 + "年" + times % 365 + "天");
}
}- 无匹配
评论 (0)