# huluwa **Repository Path**: consolelog/huluwa ## Basic Information - **Project Name**: huluwa - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-09-24 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # test ## 问题: ### java上机,没看懂在问啥?修改 很久很久以前,蜘蛛精和蝎子精俘虏了老爷爷和49名葫芦娃,蜘蛛精和蝎子精流着口水承诺不杀害任何葫芦娃,但是将他们关进一个有50间牢房的监狱里,每人一间牢房,牢房之间相互隔绝,无法输入或者输出任何信息。 监狱每天随机打开一间牢房的门,让老爷爷或者葫芦娃到院子里来放风。院子中间有一块一侧光滑一侧有花纹的圆形小石板,放风的人可以翻动石板,将石板的光滑面或者花纹面向上放置。除放风的人之外其他人都不会去碰石板。 除了石板以外,放风的人留下的任何其它痕迹都会在夜晚被清除干净(包括石板上作的任何记号)。牢房是完全封闭的,无法看到石板。 老爷爷为了能够获知蜘蛛精和蝎子精是否杀害了葫芦娃,和所有葫芦娃们商定了一个办法,这样老爷爷就能够知道所有被俘的葫芦娃是否还健在。请帮助设计老爷爷的方法,并编写程序计算老爷爷要知道所有人是否都健在可能需要多少天,请采样10次并给出平均值。 [问题链接](https://www.zhihu.com/question/298769574) ## 回答 好久没答题了,突然发现一道挺有意思的题,情不自禁来回答一下,不一定对哈。 这道题其实考验的是你的逻辑思维能力(说白了就是一道脑筋急转弯),和一些算法题比较相似,编程只是作为一个工具,想出解决方法之后就会很简单了。 先说一下我所理解的,这道题问的到底是个什么玩意儿,然后再提供一种比较笨的办法: 首先就是前提条件,有50个牢房,其中一个是老爷爷,你也可以把他当成你自己,也就是主视角。其它的都是葫芦娃,他们会提前和你商量好对策,商量好对策之后你们就被关进牢房了,谁也见不到谁,但是他们会完全服从你们之前商量好的对策并按计划执行,你们之间的沟通工具只有那一块石板。 然后是规则,每天随机打开一扇门(注意这里是随机,而不是依次),只有一个人能出来放风,并且可以选择翻动石板或者是啥也不干(因为其它的东西都会被清除,所以可以理解为啥也不干),翻动几次石板都可以,但石板只有两面,也就可以理解成true和false,你可以重新将石板赋值为true或false。 最后根据上面所说的前提条件和规则,让老爷爷(也就是你自己)想出一个方法,计算出多少天之后可以确定其余49个葫芦娃都还活着(为什么是活着而不是死了后面会说)。由于是随机开门,所以这个天数不确定,所以需要模拟10次最后求出平均值。 问题说完了,然后说说我想到的解决办法: 首先将石板看作一个标识位,他只有两面,我们就将一面提前约定为true,另一面约定为false,并假定初始值为false。 然后我们规定,而老爷爷放风的时候,如果是true,就改为false;如果是false,就啥也不干。 葫芦娃们放风的时候,如果是false,就改为true;如果是true,就啥也不干;如果之前修改过标识位,则不管是true还是false,都啥也不干。 这样每个葫芦娃修改标识位之后老爷爷都会知道,当修改次数达到49的时候,老爷爷就知道其余的葫芦娃都还活着了。 这其中有两个关键的问题,一个就是因为开门的随机性,只能确定其余葫芦娃还活着,这种方法无法得知有葫芦娃死了,只能说有葫芦娃死亡的可能性;还有一个问题,就是石板最开始是光滑一面朝上还是花纹一面朝上必须确定,如果不确定,那老爷爷就可能会算出50个葫芦娃来。 最后给出一个我自己的解决方法: [源码](https://gitee.com/consolelog/huluwa/raw/master/src/test/java/JavaTest.java)