国王和100个囚犯

国王招来100个囚犯,对他们说:你们犯的是死罪,本应该将你们统统杀掉,但我慈悲为怀,给你们一次求生的机会。15分钟以后,你们将被关进一个有100间隔离牢房的监狱里,每人一间牢房,都与外界隔绝,什么也听不见、看不到,连时间都没法计算,更别说获得外界的任何信息。(送饭除外,但也是不规律的送)

这所监狱有一个院子,每天会随机(注意是完全随机)打开一间牢房的门,让那个囚犯到院子里来放风。院子里有一盏路灯,放风的囚犯可以控制它的开关,将它打开或是关闭。除囚犯之外,其他人都不会去碰开关。这盏灯会永远有充足的能源供应,如果灯泡坏了或是电路出了故障会马上修好,当然修理人员不会改变灯的状态(开或关)。

除了开关这盏灯,放风的囚犯放风时留下的任何其它痕迹都会在夜晚被清除干净(包括在灯上作的任何记号)。

牢房是完全封闭的,院子里的灯光在牢房里看不到。只有放风出到院子里的人才能看到。

好了现在我向你们提出一个要求,只要你们做到了,就可以全部获得释放: 若干天以后,你们中只要有任何一个人能够向我证明所有的人都曾到院子里去过,你们就全体释放。当然要有证据!因为我只会给你们一次机会,如果向我证明的那个人无法自圆其说,你们就全部砍头。所以,要珍惜这次机会。如果你们永远做不到我的要求,你们就全部关到死。

现在给你们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();
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值