我解 zhyindividual (空幻闲人) 的面世题

yangbc 2004-08-05 02:14:47
应为不能回帖,只好发新贴了:
-----------------------------------------------------
问题:村里有50个人,每个人有一条狗,即有50只狗,这些狗中有病狗(不是传染病),每个人可以看除了自己的狗以外的所有狗,即49只狗。有病的狗一看就知道了,当有人推断出自己的狗是病狗的话则开枪打死自己的狗(当天知道),每人看后不准相互交流!第一天,没有枪响,第二天也没枪响,第三天,听见一阵枪响,请问村里有几只病狗,如何推算出来的?用程序实现解题~~
----------------------------------------------------

解答:一个人:
条件:如果看到病狗,则不能肯定自己的狗是否的病。(这个条件很重要)

分析:[个人注解:其实所有人第一天看完后,记下看到的数据后就可以回家等枪声做自己的判断了,不必再出来看]
他如果在外边看不到病狗,那么他当天可以确信自己的狗是病狗并杀死他,但第一天没有杀狗发生,可以证明每个人都看到了病狗,这么说病狗不是一只,>1,即=2只以上。“至少有2只病狗”的事实这个时候会被所有的人推断出来,他们各自会结合今天看到的病狗数来推断自己的狗是不是病狗,如果病狗真的只有两只,那么第二天就会有看到一只病狗的人意识到昨天没人杀狗而病狗2只自己却看到一只,那么毫无疑问自己的狗是病狗,杀之。
然而第二天仍然没有杀狗发生,可以说明一个问题:每个人都看到了至少2只病狗。这样,才可以推翻“看到一只病狗、肯定有2只病狗,然后杀自己病狗”的人必然发生的行为这个结论。
现在可以知道病狗数>2,即=3只,“病狗数至少3只”这个结论会刷新所有人的脑子。
到了第三天,其实也就是检验第二天的情况,这个时候,看到2只病狗的人肯定会毫不犹豫举枪杀死自己的狗,以此来证明“病狗数=3”这个真理。如果还没有人来杀狗,只能说明每个人都看到了至少3条病狗。恰好此时有人开了枪,可以说明有人看到了2只病狗,那么加上他杀的那只,正好是3只。太幸运了,只有3只,而且全部在第二天刚结束的时候同时被杀。:(
...全文
377 点赞 收藏 17
写回复
17 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
如果开始就知道有多少条病狗,那么第一天就会有枪响了!
回复
huhanshan013 2004-08-06
感觉应该是: 病狗数目其实村民已经知道。
加上这个前提,我想3只是对的,
要不我们可以想象,为什么有病狗的村民看见外面两只病狗,又在没有听见枪响的情况下,可以判断自己的狗是病狗了?只有一个,因为她知道村里有几条病狗。
对不对?
回复
active99 2004-08-06
题目有明显的问题,居然还有这么多人在推!!!!!
可悲啊~~~~~~~~~~~
回复
chyb1000 2004-08-06
有点错误,应该是:初始化函数:B(int i,int j) //第i个人看到第j只狗,病狗返回1,否则为0;
K //杀狗,返回值1;
参数: T //时间,其值为3
a[50]//50人;b[50]//50狗,其中b为带50个元素的vector;
for(n=0;n<3;n++){
if(i!=j){
for(i=0;i<50;i++){
for(j=0;j<b.size();j++){
B(i,j,n);

if(B(i,j,n)=1){
print j;并break里面的循环;
remove(j);//java中的vector可以做到
}else{
if(j=49){
k;
print i;
}
}
}
}
}
}
最终结果是(50 - (a.size()-(k返回的次数)))
回复
xitianjile 2004-08-06
第一天里

病狗的数目基本是已经确定范围了

如果有病狗的人看到n只病狗狗。
他不知道自己的狗是有病。他会把范围是n-n+1只
无病狗的人看到n+1只病狗。
病狗的范围是n+1-n+2;

如果是1只病狗的时候,
第一天应该有人看到的49只狗全是好狗。情况是看到1只病狗的49人。他们确定病狗的范围就是1-2只,看到0只病狗的人他已经确定一只病狗了,他就可以杀狗了。。但是第一天没有枪声。那么其他人也能确定只有一只病狗,自己的狗是没事。。

第1天没人杀狗导致第2的情况的发生,因此第一天里每人看到的狗是2只以上。。
如果是2只,那么有48个人是看到2只病狗,他们心目中的范围就是2-3只;2个人是看到1条病狗的,他们心目中的范围就是1-2只。首先肯定的是不是一只了。第一天的情况已经推翻了。。所以答案是2只。看到一只的人就可以杀狗了。

以此类推。
3天的时候已经根据第2天的情况推论出不是2只病狗了。。。
明了了吧??
回复
flyingdog 2004-08-06
基本上看懂了。程序不错。
回复
chyb1000 2004-08-05
注解:java中的vector类似堆栈,不过次序相反
回复
chyb1000 2004-08-05
最综结果应该就是50 - [a.length - (k返回的次数)],这就是三天之内查出的病狗;哈哈
前提,50条狗可以辨认出来不同
回复
chyb1000 2004-08-05
初始化函数:B(int i,int j) //第i个人看到第j只狗,病狗返回1,否则为0;
K //杀狗,返回值1;
参数: T //时间,其值为3
a[50]//50人;b[50]//50狗,其中b为带50个元素的vector;
for(n=0;n<3;n++){
if(i!=j){
for(i=0;i<50;i++){
for(j=0;j<b.size();j++){
B(i,j,n);

if(B(i,j,n)=1){
print j;并break里面的循环;
remove(i);//java中的vector可以做到
}else{
if(j=49){
k;
print i;
}
}
}
}
}
}
//不知道,狗能不能认出来
回复
超级大笨狼 2004-08-05
太复杂了,迷糊了
回复
runmin 2004-08-05
随便一搜索多的不是,就不用另外再贴了吧
回复
wwwasp 2004-08-05
感觉题目有问题,假如有10只病狗,而有病狗的人,肯定看到9只,那么就算到了第10天,有病狗的人就怎么能发现呢?又没规定一天杀一只狗...
回复
要不我说是杀了所有的狗呢,跟天数无关的,此题有且仅有唯一解
回复
chengbo1983 2004-08-05
好复杂!看得我头都晕了

怎么感觉有点像数学题中?
回复
ycted 2004-08-05
下面是楼主给我发的短信:

发送者 yangbc 发送时间 2004-8-5 17:12:49 删除 回复
内容 看到10只病狗的人在前10天都不会肯定到底有多少病狗,只有在第10天还没有枪声的时候,他才会知道有11只病狗,而且这只病狗肯定是自己这只,然后在第11天一开始,他会毫不犹豫杀死自己的狗。

不好意思,我这里只能开新贴,不能回帖了:)



=====================================================
这是我的回答:
那么是不是意味着死了10只狗啊?
回复
ycted 2004-08-05
F为你的原句.Q为我的问句
F:那么第二天就会有看到一只病狗的人意识到昨天没人杀狗而病狗2只自己却看到一只,那么毫无疑问自己的狗是病狗,杀之。
Q:
1.那个看到病狗的人不一定就只看到2只啊.他也可以看到10只啊?
2.那么上面一句这样也可以: "那么第二天就会有看到10只病狗的人意识到昨天没人杀狗而病狗>2只自己却看到10只,"

下面的就不推了,先把上面的问题解决了.
回复
hailang3275 2004-08-05
别人说得那么清楚了
你还说什么呢?
回复
相关推荐
发帖
ASP
创建于2007-09-28

2.8w+

社区成员

ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
申请成为版主
帖子事件
创建了帖子
2004-08-05 02:14
社区公告
暂无公告