`
sunwinner
  • 浏览: 202616 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

国王和100个囚犯问题

阅读更多

原帖可见:http://www.iteye.com/topic/570744,问题大致如下:

 

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


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

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

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

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

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

这是我的解决方案:

package org.sunkui.demo;

import java.util.Random;

public class PrisonExample {
	Random rand = new Random();

	public static void main(String[] args) {
		PrisonExample p = new PrisonExample();
		p.method_1(true);
	}

	void method_1(boolean light) {
		int[] prisoner = new int[100];
		// counter prisoner, the first out
		int counter = rand.nextInt(100);
		// Light turn on or off from now on
		int counterLightOnOrOff = 1;
		// whether on or off the first time, and the counter turn on/off the
		// light right now
		boolean lightOnOrOff = !light;
		// starts right now
		int days = 0;
		// the first prisoner out
		prisoner[counter] = 1;

		while (true) {
			// include the counter
			int others = rand.nextInt(100);
			days++;

			if (others == counter && !lightOnOrOff) {
				// if light is in state initialize state, put it to opposite
				// state
				lightOnOrOff = !lightOnOrOff;
				counterLightOnOrOff++;
			} else {
				// other prisoners turn the light on or off just once
				if (prisoner[others] == 0 && lightOnOrOff) {
					lightOnOrOff = !lightOnOrOff;
					prisoner[others] = 1;
				}
			}

			if (counterLightOnOrOff == 100)
				break;
		}

		System.out.println("Total days: " + days);
	}
}
分享到:
评论

相关推荐

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

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

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

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

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

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

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

    这个问题实际上是一个经典的逻辑谜题,通常被称为“囚犯与帽子”问题的一个变体。在这个变体中,100名囚犯被排列成一排,国王的命令是按照某种规则淘汰他们,直到只剩下一个为止。具体规则是:每次消除所有奇数位置...

    狱吏问题,求解钱币兑换问题,沙漠问题蛮力算法.pdf

    某国王对囚犯进行大赦,让一狱吏n次通过一-排锁着的n间. 牢房,每通过一-次按所定规则转动n间牢房中的某些门锁,每转 动一次原来锁着的被打开,原来打开的被锁上通过n次后,门锁 开着的,牢房中的犯人被放出,否则,...

    prisoner_adv.zip_prisoner_囚犯 Java

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

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

    百钱买百鸡问题是一个经典的数学问题,假设公鸡价值5元,母鸡3元,小鸡1元,但3只小鸡合起来才1元。现在有100元,要买100只鸡,问如何分配公鸡、母鸡和小鸡的数量。 实验步骤: 1. 定义变量x、y和z分别代表公鸡、...

    点杀罪犯问题

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

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

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

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

    约瑟夫问题(Josephus Problem)是一个著名的理论问题,源于古罗马时期的传说。问题的核心是:一群人围成一个圈,从某个人开始按照顺时针方向计数,每数到特定值的人会被排除,直到只剩下最后一个人为止。在这个例子...

    防止犯人串供 隔离设计

    【防止犯人串供的隔离设计】是一种数学问题,它涉及到图论中的“最小顶点覆盖”问题。在这个场景中,目标是确保每个有牵连的犯人都不能被关在同一间关押室,以防止他们串供。这个问题可以通过关系矩阵和特定的计算...

    PrisonersAndLightBulb:囚犯和灯泡问题

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

    约瑟夫环问题算法

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

    约瑟夫(josehus)问题.rar_Josephus_约瑟夫 问题 实现_约瑟夫环_约瑟夫环 数据结构_约瑟夫环问题

    在历史背景中,约瑟夫环问题描述了一群囚犯站在一个圈里,按照一定的规则每隔一定数量的人就处决一个,直到只剩最后一个人为止。这个最后幸存的人将获得自由。在计算机科学领域,这个问题被用来研究和实现数据结构和...

    约瑟夫双向生死游戏双向队列实现

    约瑟夫双向生死游戏是一种基于环形链表或队列的经典问题,它的基本思想源于一个古老的传说:在古代,一群囚犯被围成一个圈,按照一定的规则每隔一定人数淘汰一个人,直到只剩最后一个人为止。这个过程就被称为约瑟夫...

    约瑟夫问题-基于C++的约瑟夫循环问题题解.zip

    在该问题中,一群囚犯站成一个圈,并按照顺时针或逆时针顺序报数,每报到特定数值的人将被剔除出圈,然后下一轮继续从下一个人开始报数,直到只剩下最后一个人为止。这个问题可以用来探讨循环链表、数组、递归等数据...

    C++解决约瑟夫问题

    问题的基本设定是:一群囚犯站成一个圈,按照顺时针方向从某个人开始报数,每数到特定数值的人会被淘汰出局,然后从下一个人继续开始报数,直到只剩下最后一个人为止。这个最后存活的人将获得自由。约瑟夫问题在...

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

    监狱犯人自动考勤系统解决方案是一种基于 RFID 射频技术和计算机技术的自动考勤系统,旨在解决监狱中的犯人考勤问题。该系统可以有效地对犯人进行考勤,不需要犯人每天刷卡,从而提高监狱管理人员的工作效率和犯人...

    约瑟夫环问题的MFC简单实现

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

Global site tag (gtag.js) - Google Analytics