智力题-囚徒问题之一

百囚徒问题(100 prisoners problem) 该问题由丹麦计算机科学家Peter Bro Miltersen于2003年首次提出。 问题描述 在监狱中有100名囚犯,被编号为1-100号。典狱长决定给囚犯们一次特赦的机会,条件是通过一项挑战。在一个房间中放着一个有100个抽屉的橱柜,里面随机放着与囚犯编号对应的1-100的号码牌。挑战开始后,每个囚犯依次进入该房间,打开不超过半数的抽屉,并从中找到与自己对应的号码则为成功,每名囚犯出去时该橱柜... 阅读详情

一、题目

 100 prisoners are lined up and a black or white hat is to be placed on each of their heads. The prisoners cannot see the color of the hat on their own head, but they can see the colors of all the hats in front of them.

 A guard is going to walk down the line, starting in the back, and ask each prisoner what color hat they have on. They can only answer “black” or “white.” If they answer incorrectly, or say anything else, they will be shot dead on the spot. If they answer correctly, they will be set free. Each prisoner can hear all of the other prisoners’ responses, as well as any gunshots that indicate an incorrect response. They can remember all of this information.

 Before the executions begin, the prisoners get to huddle up and make a plan. How can the prisoners ensure that the most people possible survive?

一、中文题目:

  100名囚犯被排成一列,每个人头上都要戴上一顶黑色或白色的帽子。囚犯们看不到自己头上帽子的颜色,但是他们可以看到他们面前所有帽子的颜色。
  一个警卫从后面开始沿着队伍走,问每个囚犯戴着什么颜色的帽子。他们只能回答“黑”或“白”。如果他们回答错了,或者说了别的什么,他们就会被当场击毙。如果他们回答正确,他们将被释放。每个囚犯都能听到其他所有囚犯的反应,以及任何表明错误反应的枪声。他们可以记住所有这些信息。
  在处决开始之前,囚犯们挤在一起制定计划。囚犯们怎样才能确保尽可能多的人存活下来?

二、解题思路

  1. 最后一个人如果看到奇数顶帽子报“黑”;否则报“白”,他可能死;
  2. 从倒数第二人开始,就有两个信息:记住的值与看到的值,相同报“白”,不同报“黑”。
    此方案下,囚犯们的存活率是:99人能100%活,1人50%能活

三、用代码验证结论

1)先创建一个分配方案类,代码如下:

package math_puzzles;

public class solution {
    public int[] indi;
    public boolean[] survive;

	public int[] getIndi() {
		return indi;
	}

	public void setIndi(int[] indi) {
		this.indi = indi;
	}

	public boolean[] getSurvive() {
		return survive;
	}

	public void setSurvive(boolean[] survive) {
		this.survive = survive;
	}

	public solution() {
		// TODO Auto-generated constructor stub
	}

}

2)做100次实验验证提出的方案能否达到以下目标:99人能100%活,1人50%能活

package math_puzzles;
import java.lang.Math; //导入Random类bai
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import math_puzzles.solution;

public class prisoner_problem {
	public static final int LEN = 100;
	
	/*随机初始化一个序列,0与1的概率都为0.5
	 * int[] indi	:	代表囚徒帽子颜色序列
	 * */
	public static void generateChrome(int[] indi) {
		for(int i = 0;i < LEN;i++)
			//此处的0.5是个参数,可以调参;随机数生成方式可以采用动态分布等生成,此处为了方便采用了java中Math提供的随机数生成方式
			if(Math.random() > 0.5)							
				indi[i] = 1;		
	}
	
	/*统计end之前,黑帽子的数量
	 * int[] indi	:	100个囚徒所戴帽子颜色序列
	 * int end		:	要统计end之前黑色帽子的量
	 * */
	public static int getBlackHatNum(int[] indi,int end) {
		//记录下1的数目
		int num = 0;
		for(int i = 0;i < end;i++)
			num += indi[i];
		
		return end - num;
	}	
	
	/*	初始化解:
	 * solution s	:	要生成的解
	 * 为了确保尽可能多的人存活下来,囚犯们制定的计划:
	 * 	1、 最后一名囚犯计算前面所有黑帽子的个数,如果是奇数个,就猜黑,如果是偶数个,就猜白。
		2、其他人记住这个值(实际是黑帽奇偶数),在此之后当再听到黑时,取反一次
		3、从倒数第二人开始,就有两个信息:记住的值与看到的值,相同报“白”,不同报“黑”
			99人能100%活,1人50%能活 
	 * 
	 * */
	
	public static void run(solution s) {
		boolean survive[] = new boolean[LEN];
		
		// TODO Auto-generated method stub
		/*1.生成一个大小为100,内容为1或0的数组,
	    						1	:	白帽;
	    						0	:	黑帽。
		  */		
		int indi[] = new int[LEN];
		int res[] = new int[LEN];
		generateChrome(indi);		

		s.setIndi(indi);
		boolean flag = true;							//看到的值标记,奇数为 true,偶数为 false
		//2. 最后一名囚犯计算前面所有黑帽子的个数,如果是奇数个,就猜黑,如果是偶数个,就猜白。
		int tmp = LEN - 1;
		flag = getBlackHatNum(indi,tmp) % 2 == 1 ? true : false;
		if(flag) 					//如果是奇数个,就猜黑,如果是偶数个,就猜白。
			res[tmp] = 0;
		else
			res[tmp] = 1;	
		survive[tmp] = indi[tmp] != res[tmp] ? false : true;
		
		
		//3.从倒数第二人开始,就有两个信息:记住的值与看到的值,相同报“白”,不同报“黑”
		boolean preFlag = flag;							//记住的值标记
		for(int i = LEN - 2;i >= 0;i--) {
			flag =  getBlackHatNum(indi,i) % 2 == 1 ? true : false;
			if(flag == preFlag)
				res[i] = 1; 						//记住的值与看到的值,相同报“白”
			else
				res[i] = 0;							//不同报“黑”
			preFlag = flag;
		}		
		
		//survive数组记录下哪个囚徒会死
		for(int i = 0;i < LEN - 1;i++) 
			if(indi[i] != res[i])
				survive[i] = false;
			else
				survive[i] = true;
		s.setSurvive(survive);
	}
	

	/*验证run_time(此处为:100)次实验中,囚徒的生还率是不是:99人能100%活,1人50%能活 
	 * */
	public static void main(String[] args) {
		int run_time = 100;
		ArrayList<solution> list = new ArrayList<solution>();
		for(int i = 0;i < run_time;i++) {
			solution s = new solution();
			run(s);
			list.add(s);
		}
		Map<Integer, Integer> map = new HashMap<Integer, Integer>();
		for(int i = 0;i < LEN;i++) {
			int count = 0;
			for(int j = 0;j < run_time;j++) {
				if(list.get(j).survive[i])
					count++;
			}
			
			if(map.containsKey(count)){
				int value = map.get(count);
				value = value + 1;
				map.put(count, value);
			}else{
				map.put(count, 1);
            }			
		}
		
		for(Map.Entry<Integer, Integer> entry : map.entrySet()){
			int key = entry.getKey();
			int value = entry.getValue();      
			System.out.println("此方案下,囚犯们的存活率是:" + value + "人能" + key + "%活");
		}		

	}

}

四、结论

  针对此问题,提出的方案,能够实现“99人能100%活,1人50%能活”的目标。所以,提出的算法是真实的、有效的。

Ubuntu20.04/Debian10安装向日葵远程控制踩坑实录(附依赖问题解决方案) 本文详细介绍了在Ubuntu 20.04/Debian 10系统上安装向日葵远程控制软件的全过程,重点解决了常见的依赖问题,特别是libwebkitgtk相关错误。通过自动修复、手动修改.deb包依赖和使用兼容层三种解决方案,帮助用户顺利完成安装并优化远程控制体验。 阅读详情

相关推荐

AXI4协议之AXI4-Lite接口详解及实战

本文首先对AXI4总线协议进行了一个简单的介绍,然后使用vivado提供的模板创建了一个AXI4-Lite Master的接口,并生成了一个具有Master和Slave的代码实例,阅读该示例代码,进行修改后用于自己的项目。

高阶近似的博客 2万+

100囚犯问题、100囚犯问题加强版与选择公理(上)

    今后决定把较长的文章分段发布,不然大家读着太累。况且篇幅短一些的话,RSS输出也好看些:)    在讲问题的加强版之前,让我们先来回忆一下经典的100囚犯问题(不是灯泡)。    100个囚犯从前往后坐成一列。坐在最后面的那个囚犯能够看到其余99个囚犯,坐在最前面的那个囚犯啥也看不见。看守给每个囚犯戴上一顶黑色的或者白色的帽子。然后,看守会从后往前依次叫这些囚犯猜测自己头顶上

matrix67的专栏 1514

使用ADS进行LNA低噪放设计的详细教程

详细介绍了通过ADS软件进行LNA设计的过程,从晶体管的选型到稳定性系数分析、再到输入输出端匹配,完整的讲解了低噪放的设计流程,可以使新手小白以及学习射频放大器的朋友可以快速的了解掌握ADS的使用方法和LNA的设计方法。

weixin_41831333的博客 3448

智力题----囚犯猜帽子问题

智力题----囚犯猜帽子问题题目最佳解决方法思路现在开始游戏:总结 最近在刷牛客网的题目,偶然看到这到题,发现提供的答案对于最佳解决方法说的比较模糊,所以就在这里详细的讲一下最佳解决方法到底是怎样实现的,当作自己的一个小笔记。 题目 100个囚犯从前往后坐成一列。坐在最后面的那个囚犯能够看到其余99个囚犯,坐在最前面的 那个囚犯啥也看不见。看守给每个囚犯戴上一顶黑色的或者白色的帽子。然后,看守会从...

hqpshidashen的博客 9783

Vercel部署个人博客

先去注册一个账号,建议注册一个Github账号后,使用Github账号来登录Vercel。vercel 部署静态资源网站极其方便简单,并且有可观的访问速度,最主要的是免费部署。此时项目已经成功搭建完毕了,点击图片即可跳转到 vercel 所提供的二级域名访问。然后可以直接拉取我的仓库,所有已经配置好了,可以直接使用,建议fork成自己的!然后修改dns就行,注意vercel提供的域名可能访问不了,需要自己绑定!如果有自己的域名,还可以在 vercel 中进行设置。进入Vercel官网。

醉里博客202271.xyz 2357

PICO+Unity MR空间网格开发实战:从零构建透视交互场景

本文详细介绍了使用PICO 4 Ultra与Unity引擎进行MR空间网格开发的完整实战流程。从环境准备、项目初始化、核心组件配置,到空间网格的生成、可视化与物理交互实现,手把手教你构建一个能识别真实环境并发射虚拟小球的透视交互场景。文章重点解析了PICO SDK中空间网格功能的关键配置与优化技巧,并提供了真机部署与调试的实用指南。

e3f4g5的博客 490

囚徒活命问题(博弈论)

5个囚犯,分别按1-5号在装有100颗绿豆的麻袋抓绿豆,规定每人至少抓一颗,而抓得最多和最少的人将被处死,而且,他们之间不能交流,但在抓的时候,可以摸出剩下的豆子数。问他们中谁的存活几率最大? 提示: 1,他们都是很聪明的人       2,他们的原则是先求保命,再去多杀人       3,100颗不必都分完       4,若有重复的情况,则也算最大或最小,一并处死  5

1373

STM32F407+HAL库+W5500实现TCP通讯 个人项目总结

推荐阅读此博客 cv即可成功首先需要一个可以进行串口调试的工程,方便进行调试。1.在W5500官网移植库文件重点是Ethernet这个文件夹将里面的 socket.c,socket.h,wizchip_conf.c,wizchip_conf.h,还有根据W5500文件夹里的w5500.c和w5500.h移植到自己的工程里面。然后再创建一个.c和.h文件 我的叫w5500_port_hal.c 和w5500_port_hal.h 记得将.h文件链接到工程里。

a234abr的博客 2247

囚徒逃生问题优化策略

今天给大家分享的就是一道有意思的数学题,这题是前阵子在网上充电时看到的,也欢迎大家提出更优解。

一群专业码农的笔记本 1303

18、动态系统响应分析

本文系统地介绍了动态系统响应的分析方法,涵盖传递函数建模、特殊输入下的响应特性(如脉冲和阶跃响应)、终值与初值定理的应用、系统直流增益的计算,并深入探讨了一阶和二阶系统的时域特性。通过实例分析与MATLAB仿真,展示了不同参数对系统行为的影响。文章还总结了系统响应在控制设计与故障诊断中的实际应用,并展望了多变量、非线性及实时响应分析的未来研究方向。配合流程图,提供了清晰的系统分析与设计路径。

kite3的博客 140

从VLM到VLA概论

智驾视觉大模型

xiaomu_347的博客 1707

微软面试题:100个囚徒1个灯泡,没有任何通信,怎么确定所有人都来过?

上周有个朋友去面微软,被问到了一道经典的智力题。那道题有名有姓,叫 "100 Prisoners in Solitary Cells",在微软官方面试题列表里排得上前十。前面刚聊完 Paxos 和分布式共识,面试官话锋一转,说给你出道智力题。题目是这样的。100个囚徒,关在100个单人牢房里,互相之间不能通信。监狱里有一个特殊的房间,里面只有一个灯泡,一个开关。每天,狱卒会随机选一个囚徒去这个房间。囚徒进去之后,可以开灯,也可以关灯,也可以什么都不做。

Java架构师之路的博客 189

【AI Agent】Hermes Agent解析

Hermes Agent:一个具备持久化学习能力的开源AI Agent框架 核心特点: 突破传统Agent的"无状态困境",通过记忆系统(SQLite+FTS5全文检索)实现跨会话经验积累 支持200+模型自由切换,11种模型家族和15+平台接入 五层架构设计(入口层、编排层、推理层、工具执行层、存储层)实现平台无关性 47+内置工具和动态技能沉淀机制,支持从任务执行中自动提炼可复用Skill 独特的四层记忆体系(会话/每日/长期/向量索引)和辩证式用户建模 与传统Agent对比: 具备自我进化能力,通过A

sysu_lluozh 922

【面试】面试常见的智力题

智力题是一种通过逻辑推理、数学计算或创造性思维来解决的问题。它们通常没有固定的解题模式,需要候选人灵活运用知识和技巧。问题描述为什么井盖通常是圆形的?解题思路从几何、物理和实用性角度分析。答案安全性:圆形井盖不会掉入井口,因为直径相等。易于搬运:圆形井盖可以滚动,便于搬运。均匀受力:圆形结构受力均匀,不易损坏。智力题是面试中常见的考察方式,旨在测试候选人的逻辑思维能力、创造性思维和应变能力。通过掌握常见的智力题类型和解题技巧,候选人可以在面试中更加自信地应对这类问题。多练习。

Ape's IT Blog 2316

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

模拟百囚徒问题

模拟百囚徒问题

忆灬凝的博客 695

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【囚徒困境】

【囚徒困境】 假设有两个小偷A和B联合犯事、私入民宅被警察抓住。警方将两人分别置于不同的两个房间内进行审讯,对每一个犯罪嫌疑人,警方给出的政策是:如果一个犯罪嫌疑人坦白了罪行,交出了赃物,于是证据确凿,两人都被判有罪。如果另一个犯罪嫌疑人也作了坦白,则两人各被判刑8年;如果另一个犯罪嫌人没有坦白而是抵赖,则以妨碍公务罪(因已有证据表明其有罪)再加刑2年,而坦白者有功被减刑8年,立即释放。如果两人都抵赖,则警方因证据不足不能判两人的偷窃罪,但可以私入民宅的罪名将两人各判入狱1年。 关于这个案例,显然最好的策.

weixin_47906106的博客 697

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

面试智力题大全

1,马戏团里有两个侏儒,瞎子侏儒比另一个侏儒矮,马戏团只需要一个侏儒,马戏团里的侏儒当然是越矮越好了.两个侏儒决定比谁的个子矮,个子高的就去自杀.可是,在约定比个子的前一天,瞎子侏儒也就是那个矮的侏儒已经在家里自杀死了.在他的家里只发现木头做的家具和满地的木屑.问他为什么自杀?2,有个男的跟他女友去河边散步,突然他的女友掉进河里了,那个男的就急忙跳到水里去找,可没找到他的女友,他伤心的离开了这

fayzhou的专栏 1万+

面试智力题

1,马戏团里有两个侏儒,瞎子侏儒比另一个侏儒矮,马戏团只需要一个侏儒,马戏团里的侏儒当然是越矮越好了.两个侏儒决定比谁的个子矮,个子高的就去自杀.可是,在约定比个子的前一天,瞎子侏儒也就是那个矮的侏儒已经在家里自杀死了.在他的家里只发现木头做的家具和满地的木屑.问他为什么自杀?2,有个男的跟他女友去河边散步,突然他的女友掉进河里了,那个男的就急忙跳到水里去找,可没找到他的女友,他伤心的离开了这

风之去向 766

逻辑智力题面试本质:思维操作系统校准指南

逻辑智力题并非考察智商或知识储备,而是对工程师底层思维能力的高效评估——它聚焦信息压缩、结构化推演与认知弹性三大核心。其原理源于离散数学中的状态空间建模、信息熵计算与条件概率分析,技术价值在于低成本识别候选人解决真实问题的元能力。典型应用场景包括系统故障归因、AB测试设计、多约束产品决策等工程实践。本文以12球问题、三门问题等高频题型为切口,揭示如何将‘灵光一现’转化为可复用、可验证、可迁移的思维校准协议。

weixin_33806859的博客 332

哈哈,收集的智力题

1、微软面试题:利用天平砝码,三次将140克的盐 分成50、90克两份?         有一个天平,2克和7克砝码各一个。如何利用天平砝码在三次内将140克盐分成50,90克两份。 解决方法1:1. 利用天平将140克分成70,70克两份。                       2. 利用天平将70克分成35,35克两份。                       3. 利用

OOM 1173

面试 智力题

有 100 个囚犯分别关在 100 间牢房里。牢房外有一个空荡荡的房间,房间里有一个由开关控制的灯泡。初始时,灯是关着的。看守每次随便选择一名囚犯进入房间,但保证每个囚犯都会被选中无穷多次。如果在某一时刻,有囚犯成功断定出所有人都进过这个房间了,所有囚犯都能释放。游戏开始前,所有囚犯可以聚在一起商量对策,但在此之后它们唯一可用来交流的工具就只有那个灯泡。他们应该设计一个怎样的协议呢? 首先,第一天出来的人,担当“计数者”,它把灯开起来(原来开着就不必动了), 然后每天出来一个囚犯。 如果他不是“计数..

m0_50707332的博客 2393

智力题拆解指南:从分类到实战的思维训练方法

逻辑推理与模式识别是认知训练的核心能力,其原理在于通过结构化方法将模糊问题转化为可操作模型。技术价值在于提升问题拆解效率与决策质量,应用场景涵盖面试评估、亲子教育及团队决策复盘。掌握题型分类与拆解框架,能有效识别信息压缩与心理陷阱,将智力题转化为可复用的思维工具。本文系统梳理五类智力题的拆解路径与实操技巧,助力读者建立元认知觉察能力。

weixin_34094282的博客 52

关于五个囚犯的智力题

原链接:http://www.xiami.com/group/thread-detail/tid/190267 题目:5个囚犯,分别按1-5号在装有100颗绿豆的麻袋抓绿豆,规定每人至少抓一颗,而抓得最多和最少的人将被处死,而且,他们之间不能交流,但在抓的时候,可以摸出剩下的豆子数。问他们中谁的存活机率最大??提示:1,他们都是很聪明的人2,他们的原则是先求保命,再去多杀人3,100颗...

完美演出 477

【底层逻辑】死囚试毒酒(改编)

高难度智力题之死囚试毒酒改编版: 现在有1024瓶红酒,其中有一瓶有剧毒。 人喝了之后经过大约七天然后突然毒发而死。 (喝一滴和喝一瓶效果一样,七天内并没有病发的现象) 毒酒跟普通红酒外表、气味完全一样,所以除了用活人试毒外别无他法。 现在你手上有一批用来试毒的死囚,每位死囚都按规定能收取安家费一万元(不论最后是否中毒)。 你必须于七天后找出哪一瓶是毒酒。...

weixin_34100227的博客 1533

Think Outside the Box: 一道原创智力题

    七等分正方形,四笔串连3x3的点阵,12根火柴棍摆出面积为1的封闭图形,这些题目见多了,再整人已经没用了。今天我第一次自己想了一个好玩的这类题目。    有个OI题的大意是,给你一个不超过200位的字符串,请问它第一次出现在串"1234567891011121314..."的什么位置。这道题可以用O(n^3)的枚举AC。    今天和arthas聊天时突然想到一个问题,使得输

matrix67的专栏 838

程序员小灰原创汇总

程序员小灰2019年原创汇总 程序员小灰2018年原创汇总 程序员小灰2017年原创汇总

xupeng1644的博客 2252
上一篇: C++面试知识点汇总
下一篇: JAVA常见面试题-不完全版
zhangkkit
博客等级 码龄11年 1131粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值