`
lolopig
  • 浏览: 7423 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
最近访客 更多访客>>
社区版块
存档分类
最新评论

国王和100个囚犯

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

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

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

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

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

现在给你们15分钟商量你们的方案。15分钟以后,你们将被关进我刚才说的那个监狱,永远无法再交流。


public interface Demo {
	
	public void doBool(); 

}

public class Demo2 implements Demo{
	
	/**
	 * 普通囚犯
	 * 第一次见灯开着时关掉
	 * 无论出去多少回,只能关灯一次
	 */
	
	public int count = 0;
	public boolean first = true;
	public String name;
	
	@Override
	public void doBool() {
		// TODO Auto-generated method stub
		if(Test.bool && first){
			Test.bool = false;
			first = false;
		}
		count++;
	}
}

public class Demo3 implements Demo{
	
	/**
	 * 计数员
	 * 出去后就开灯
	 * 如果开着就不去动他
	 * 
	 * 直到第99次出去关灯的时候就是100个人都出去过了
	 */
	
	public int closeCount = 0;
	public String name;
	
	@Override
	public void doBool() {
		// TODO Auto-generated method stub
		if(!Test.bool){
			Test.bool = true;
			closeCount++;
			if(closeCount == 99){
				Test.ok = true;
			}
		}
	}
}


public class Test {

	public static boolean bool = false;
	public static boolean ok = false;

	public static void main(String[] args) {
		int num = 0;
		int count = 0;
		Demo[] demo = new Demo[100];
		Demo2 demo2;
		for (int i = 1; i <= 99; i++) {
			demo2 = new Demo2();
			demo2.name = "d" + i;
			demo[i - 1] = demo2;
		}
		Demo3 demo3 = new Demo3();
		demo3.name = "d100";
		demo[99] = demo3;

		while (true) {
			num = (int) (Math.random() * 100);
			demo[num].doBool();
			count++;
			if (ok)
				break;
		}

		for (int j = 0; j < demo.length - 1; j++) {
			Demo2 d2 = (Demo2) demo[j];
			System.out.println(d2.name + ":" + d2.count);
		}
		System.out.println("执行次数:" + count);
	}
}


代码写的不好。
分享到:
评论
5 楼 metaphy 2010-01-13  
结果差不多。
package test.prisoner;

import java.util.Random;

public class Prisoner {
	public static void main(String[] args) {
		Random r = new Random();
		int[] prisoner = new int[100];
		final int COUNTER_ID = 0; // 任意指定计数员
		boolean lightOn = false;
		int counterLightOff = 0;
		int days = 0;

		while (true) {
			int n = r.nextInt(100);
			days++;
			if (n == COUNTER_ID) {
				if (!lightOn) {
					lightOn = true;
					counterLightOff++;
					prisoner[COUNTER_ID] = 1;
				}
			} else {
				if (lightOn) {
					if (prisoner[n] == 0) {
						lightOn = false;
						prisoner[n] = 1;
					}
				}
			}
			if (counterLightOff == prisoner.length)
				break;
		}

		// Result check
		int sum = 0;
		for (int i = 0; i < prisoner.length; i++) {
			sum += prisoner[i];
		}
		System.out.println(sum + " prisoners were out at least once!");
		System.out.println("Total days: " + days + "; years: " + days / 365);
	}
}
4 楼 metaphy 2010-01-13  
上面那个代码有点问题,就是假设每人都知道自己是不是第一个出来的。待会回去再写一个
3 楼 metaphy 2010-01-13  
嗯。有趣。 比较好奇他们得花多少年出来 -
import java.util.Random;

public class Prisoner {
	public static void main(String[] args) {
		Random r = new Random();
		int[] prisoner = new int[100];

		int n = r.nextInt(100);
		int counterID = n; // 第一天出去的那个就是记数员
		prisoner[n] = 1;
		int counterLightOff = 1;
		boolean lightOn = true;

		int days = 0;

		while (true) {
			n = r.nextInt(100);
			days++;

			if (n == counterID) {
				if (!lightOn) {
					lightOn = true;
					counterLightOff++;
				}
			} else {
				if (lightOn) {
					if (prisoner[n] == 0) {
						lightOn = false;
						prisoner[n] = 1;
					}
				}
			}
			if (counterLightOff == 100)
				break;
		}

		// Result check 
		int sum = 0;
		for (int i = 0; i < prisoner.length; i++) {
			sum += prisoner[i];
		}
		System.out.println(sum + " prisoners were out at least once!");
		System.out.println("Total days: " + days + "; years: " + days / 365);
	}
}


结果要25-35年
2 楼 clyman 2010-01-13  
能用foreach就foreach吧
1 楼 yangyi 2010-01-13  
只有这个办法,代码应该还可以再优化一下

相关推荐

    趣味算法:国王和100个囚犯.doc

    "趣味算法:国王和100个囚犯" 这个题目是一个经典的算法问题,属于计算机科学和信息论的领域。问题的核心是,如何设计一个策略,使得100个囚犯至少每人都能至少放风一次,并且在监狱中不允许交流的情况下,如何证明...

    100-prisoners:模拟解决100名囚犯和灯泡问题的不同策略

    该存储库包含用于模拟100名囚犯和一个灯泡问题的代码。 问题 有一个监狱,院子里有可以由囚犯打开或关闭的灯。 有100个囚犯被单独监禁,这意味着他们不能彼此互动,也不能从外界获得任何感官信息。 入狱时,灯泡将...

    oj_从1开始报数_编号1至n_n个死囚犯围成一圈_报到数m时_继续上述操作_

    在这个特定的版本中,n个死囚犯围成一圈,每个人都被赋予了一个从1到n的编号,他们从1开始依次报数,每当报到m的人就会被处决,然后从下一个人继续报数,这个过程一直持续,直到只剩下最后一个囚犯。 解决这个问题...

    有100名囚犯让他们依次站成一排国王命令手下先干掉全部奇数位置处的人 再次干掉全部奇数位置处的直到最后剩下一个人为止剩最后幸存者

    在这个变体中,100名囚犯被排列成一排,国王的命令是按照某种规则淘汰他们,直到只剩下一个为止。具体规则是:每次消除所有奇数位置上的囚犯,然后在剩下的偶数位置上重复这个过程,直到只剩下一名囚犯。 首先,...

    prisoner_adv.zip_prisoner_囚犯 Java

    "囚犯逃跑问题"是一个有趣的逻辑问题,它通常被转化为编程任务,以Java这样的编程语言来解决。这个问题的核心在于模拟和优化策略,以求得最优解。 首先,让我们深入理解"囚犯逃跑问题"。假设我们有N个囚犯,他们被...

    java 算法实现只是一个简单的测试例子

    “一百个囚犯的故事”是一个经典的算法问题,通常被用来展示逻辑和概率思维。问题大致是这样的:有一百名囚犯,监狱长给他们每人一个不透明的盒子,盒子里有不同颜色的球,囚犯们不能看到其他人的球。他们需要通过...

    防止犯人串供 隔离设计

    在这个场景中,目标是确保每个有牵连的犯人都不能被关在同一间关押室,以防止他们串供。这个问题可以通过关系矩阵和特定的计算步骤来解决。 1. **关系矩阵构建**:首先,建立一个8x8的关系矩阵,表示犯人之间的关系...

    php约瑟夫问题解决关于处死犯人的算法

    在这个例子中,法官要判处4个犯人死刑,他制定了一个规则,从第s个人开始,每数到第D个人就会被处死,直至只剩下一个犯人可以获得赦免。 在PHP中,解决约瑟夫问题通常涉及到数组和指针的操作。提供的代码示例给出了...

    监狱犯人自动考勤系统解决方案.doc

    监狱犯人自动考勤系统解决方案的计数管理软件界面提供了一个友好的用户界面,方便用户对犯人进行考勤和管理。 八、产品照片 监狱犯人自动考勤系统解决方案的产品照片展示了产品的外观和实际应用场景。

    对动物的友善和对人的言语攻击性:以监狱囚犯教育网络为例

    在2015年收集的样本中,有两个成人教育班级相当于一个中学水平(A级为23名犯人,B级为12名犯人,全部为男性),位于一个教养所。 使用问卷。 网络分析软件(Visone)和常规统计信息(SPSS)用于计算网络变量(in...

    PrisonersAndLightBulb:囚犯和灯泡问题

    每天,监狱长随机挑选一个囚犯,然后那个囚犯访问房间。 囚犯可以切换灯泡。 囚犯可以选择断言所有 N 个囚犯现在都到过房间。 如果此断言为假,则所有 N 个囚犯都被枪杀。 否则,所有囚犯都将被释放。 这个问题有...

    网络游戏-基于Zigbee无线网络和GPRS无线网络的犯人监控系统.zip

    《网络游戏-基于Zigbee无线网络和GPRS无线网络的犯人监控系统》是一个结合了现代信息技术与安全监控的创新方案。该系统的核心是利用Zigbee无线网络和GPRS无线网络的技术,实现对犯人的实时、高效监控,确保监狱管理...

    论文研究 - 我们是社会囚犯吗?

    但是,样本量只有170多个受访者,并且使用了便利抽样技术,因为这是一种研究,本质上是特殊的,因此,目前仅添加了那些受访者来做这项工作。 研究人员发现每个自变量(MA,SSQ,SE和SR)与因变量(巴基斯坦的社会...

    蛮力法求解百钱买百鸡的问题

    4. 如果公鸡、母鸡和小鸡的总价等于100元,且小鸡数量是3的倍数,那么找到了一个解,输出这个解并累加计数器count。 5. 如果没有找到任何解,则输出“问题无解”。 实验代码: ```cpp #include #include using ...

    电信设备-一种犯人信息采集装置.zip

    这里我们关注的是一种特别的应用场景——犯人信息采集装置。这个装置是电信技术与司法管理相结合的产物,旨在提高监狱管理和犯人信息处理的效率。 犯人信息采集装置通常包含了多种技术集成,例如生物识别技术(如...

    点杀罪犯问题

    用单向循环链表实现了对点杀罪犯问题(约瑟夫问题)的处理。

    约瑟夫环问题算法

    该问题的基本设定是:一群囚犯围成一个圈,按照顺时针方向从某个人开始计数,每数到特定数值的人会被剔除出圈,然后从下一个人继续计数,直到只剩下最后一个人为止。这个最后剩下的人将获得自由。在编程领域,约瑟夫...

    小学数学数学神探哪个是犯人

    小学数学数学神探哪个是犯人

    元首与囚犯_人生故事.pdf

    元首与囚犯_人生故事.pdf

Global site tag (gtag.js) - Google Analytics