国王招来100个囚犯,对他们说:你们犯的是死罪,本应该将你们统统杀掉,但我慈悲为怀,给你们一次求生的机会。15分钟以后,你们将被关进一个有100间隔离牢房的监狱里,每人一间牢房,都与外界隔绝,什么也听不见、看不到,连时间都没法计算,更别说获得外界的任何信息。(送饭除外,但也是不规律的送)
这所监狱有一个院子,每天会随机(注意是完全随机)打开一间牢房的门,让那个囚犯到院子里来放风。院子里有一盏路灯,放风的囚犯可以控制它的开关,将它打开或是关闭。除囚犯之外,其他人都不会去碰开关。这盏灯会永远有充足的能源供应,如果灯泡坏了或是电路出了故障会马上修好,当然修理人员不会改变灯的状态(开或关)。
除了开关这盏灯,放风的囚犯放风时留下的任何其它痕迹都会在夜晚被清除干净(包括在灯上作的任何记号)。
牢房是完全封闭的,院子里的灯光在牢房里看不到。只有放风出到院子里的人才能看到。
好了现在我向你们提出一个要求,只要你们做到了,就可以全部获得释放: 若干天以后,你们中只要有任何一个人能够向我证明所有的人都曾到院子里去过,你们就全体释放。当然要有证据!因为我只会给你们一次机会,如果向我证明的那个人无法自圆其说,你们就全部砍头。所以,要珍惜这次机会。如果你们永远做不到我的要求,你们就全部关到死。
现在给你们15分钟商量你们的方案。15分钟以后,你们将被关进我刚才说的那个监狱,永远无法再交流。
Slave.java
Light.java
Task.java
Main.java
这所监狱有一个院子,每天会随机(注意是完全随机)打开一间牢房的门,让那个囚犯到院子里来放风。院子里有一盏路灯,放风的囚犯可以控制它的开关,将它打开或是关闭。除囚犯之外,其他人都不会去碰开关。这盏灯会永远有充足的能源供应,如果灯泡坏了或是电路出了故障会马上修好,当然修理人员不会改变灯的状态(开或关)。
除了开关这盏灯,放风的囚犯放风时留下的任何其它痕迹都会在夜晚被清除干净(包括在灯上作的任何记号)。
牢房是完全封闭的,院子里的灯光在牢房里看不到。只有放风出到院子里的人才能看到。
好了现在我向你们提出一个要求,只要你们做到了,就可以全部获得释放: 若干天以后,你们中只要有任何一个人能够向我证明所有的人都曾到院子里去过,你们就全体释放。当然要有证据!因为我只会给你们一次机会,如果向我证明的那个人无法自圆其说,你们就全部砍头。所以,要珍惜这次机会。如果你们永远做不到我的要求,你们就全部关到死。
现在给你们15分钟商量你们的方案。15分钟以后,你们将被关进我刚才说的那个监狱,永远无法再交流。
Slave.java
package KingSlave;
/**
* 囚犯
* @author xKF24276 RuiLin.Xie
*
*/
public class Slave
{
//囚犯编号
private int id;
//囚犯职务,null开关灯无职务,COUNT计数员
private String duty;
//囚犯是否开过灯
private boolean oned;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getDuty() {
return duty;
}
public void setDuty(String duty) {
this.duty = duty;
}
public boolean isOned() {
return oned;
}
public void setOned(boolean oned) {
this.oned = oned;
}
}
Light.java
package KingSlave;
/**
* 灯
* @author xKF24276 RuiLin.Xie
*
*/
public class Light
{
//灯开关,off关,on开
private static boolean on_off = false;
//灯是否开着,true是,false否
public static boolean isOpen()
{
return on_off;
}
//开灯
public static void On()
{
on_off = true;
}
//关灯
public static void Off()
{
on_off = false;
}
}
Task.java
package KingSlave;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* 任务
* @author xKF24276 RuiLin.Xie
*
*/
public class Task
{
//人数
private final static int COUNT = 5;
//几个开过灯
private static int OnCount = 0;
public void run() throws InterruptedException
{
//所有囚犯
List<Slave> allSlave = new ArrayList<Slave>();
//初始化
init(allSlave);
Random random = new Random();
//计算共出入几次
int c = 0;
while(true)
{
Thread.sleep(500);
//如果都开过灯,则游戏结果
if(OnCount == COUNT - 1)
{
break;
}
c++;
//随机选取囚犯看风
int num = random.nextInt(COUNT);
Slave slave = allSlave.get(num);
String msg = "";
//如果是计票员
if(slave.getDuty() != null)
{
msg = "计票员" + num + "放风,";
//如果打开着
if(Light.isOpen())
{
//关灯
Light.Off();
//计一个开过灯
OnCount++;
msg += "发现灯开着,关灯并计一人开过灯";
}
else
{
msg += "发现灯关着,放风结束回房";
}
}
//如果不是计票员
else
{
msg = "普通囚犯" + num + "放风,";
//如果灯关着
if(!Light.isOpen())
{
msg += "发现灯关着,";
//如果没有开过灯,则开灯
if(!slave.isOned())
{
//开灯
Light.On();
msg += "开灯后回房";
slave.setOned(true);
}
else
{
msg += "但该囚犯已开过灯,所以直接回房";
}
}
else
{
msg += "发现灯开着,直接回房";
}
}
System.out.println(msg);
}
System.out.println("共出入" + c + "次");
}
//初始化囚犯,包插选定计票人
public void init(List<Slave> allSlave)
{
Random random = new Random();
int num = random.nextInt(COUNT);
//初始化囚犯,选出计数的人
for(int i = 0; i < COUNT; i++)
{
Slave slave = new Slave();
slave.setId(i);
//计票员
if(i == num)
{
slave.setDuty("COUNT");
System.out.println(i + "号囚犯被选为计票员,其他为普通囚犯");
}
else
{
slave.setDuty(null);
}
slave.setOned(false);
allSlave.add(slave);
}
}
}
Main.java
package KingSlave;
/**
* 国王和100个囚犯
* @author xKF24276 RuiLin.Xie
*
*/
public class Main {
public static void main(String[] args) throws InterruptedException
{
Task task = new Task();
task.run();
}
}