Jun 23

智力题 --- 个个撒谎 不指定

felix021 @ 2007-6-23 16:08 [IT » 程序设计] 评论(0) , 引用(0) , 阅读(3345) | Via 本站原创 | |
智力题 --- 个个撒谎

一 个精神病医生在寓所被杀,他的四个病人受到警方传讯。  

1,警方根据目击者的证词得知,在医生死亡那天, 这四个病人都单独去过一次医生的寓所。  
2,在传讯前,这四个病人共同商定,每人向警方作 的供词条条都是谎言。 每个病人所作的两条供词分别是:  

埃弗里  

(1)我们四个人谁也没有杀害精神病医生。  
(2)我离开精神病医生寓所的时候,他还活着。  

布莱克  

(1)我是第二个去精神病医生寓所的。  

(2)我到达他寓所的时候,他已经死了。  

克 朗  

(1)我是第三个去精神病医生寓所的。  

(2)我离开他寓所的时候,他还活着。  

戴维斯  

(1)凶手不是在我去精神病医生寓所之后去的。  
(2)我到达精神病医生寓所的时候,他已经死了。  

这四个病人中谁杀害了精神病医生? 他们去到公寓的次序是怎样的?







从这八条虚假供词的反面可得出以下八条真实的情况:  

(1)这四人中的一人杀害了精神病医生。  
(2)埃弗里离开精神病医生寓所的时候,精神病医生已经死了。  
(3)布莱克不是第二个去精神病医生寓所的。  
(4)布莱克到达精神病医生寓所的时候,精神病医生仍然活着。  
(5)克朗不是第三个到达精神病医生寓所的。  
(6)克朗离开精神病医生寓所的时候,精神病医生已经死了。  
(7)凶手是在戴维斯之后去精神病医生寓所的。  
(8)戴维斯到达精神病医生寓所的时候,精神病医生仍然活着。  

根据这里的真实情况(1)、(4)、(8).(2)和(6),布莱克和戴 维斯是在埃弗里和克朗之前去精神病医生寓所的。根据真实情况(3),戴维斯必定是第二个去的;从而布莱克是第一个去的。 根据真实情况(5),埃弗里必定是第三个去的;从而克朗是第四个去的。 精神病医生在第二个去他那儿的戴维斯到达的时候还活 着,但在第三个去他那儿的埃弗里离开的时候已经死了。因此,根据真实情况(1),杀害精神病医生的是埃弗里或者戴维斯。 根据真实情况(7),埃弗里是凶手。



注明:
以上是直接copy别人的思路
http://zhidao.baidu.com/question/2690472.html
因为去思考这样的问题真是太费脑子了
对于这样的逻辑判断问题
我们应该交给电脑去做
看看下面的代码吧
是用C写的:
All by Felix021


/*
(1) 这四人中的一人杀害了精神病医生。
(2) 埃弗里离开精神病医生寓所的时候,精神病医生已经死了。
(3) 布莱克不是第二个去精神病医生寓所的。
(4) 布莱克到达精神病医生寓所的时候,精神病医生仍然活着。
(5) 克朗不是第三个到达精神病医生寓所的。
(6) 克朗离开精神病医生寓所的时候,精神病医生已经死了。
(7) 凶手是在戴维斯之后去精神病医生寓所的。
(8) 戴维斯到达精神病医生寓所的时候,精神病医生仍然活着。
*/
#include
#include

int Afred,Black,Crown,Davis;
void judge();/*判断得出的这个顺序是不是对的*/

int main()
{
for(Afred=1;Afred<=4;Afred++)/*列出每个人去的顺序,从1~4*/
{
for(Black=1;Black<=4;Black++)
{
if(Black==Afred)continue;/*任意两个人去的顺序不相同*/
if(Black==2)continue; /*布莱克不是第二个去精神病医生寓所的。*/
for(Crown=1;Crown<=4;Crown++)
{
if(Crown==Black||Crown==Afred)continue;/*任意两个人去的顺序不相同*/
if(Crown==3)continue; /*克朗不是第三个到达精神病医生寓所的。*/
for(Davis=1;Davis<=4;Davis++)
{
if(Davis==Crown||Davis==Black||Davis==Afred)continue;/*任意两个人去的顺序不相同*/
judge();/*判断得出的这个顺序是不是对的*/
}
}
}
}
while(1);
return 0;
}

void judge()
{
char name[5][10];
int i,died[5];/*died数组存储每个人离开以后医生的状态,0是活着 1是死了*/

/*埃弗里离开精神病医生寓所的时候,精神病医生已经死了。*/
died[Afred]=1;
  
/*布莱克到达精神病医生寓所的时候,精神病医生仍然活着。*/
/*减1表示到达之前的状况*/
died[Black-1]=0;  
  
/*克朗离开精神病医生寓所的时候,精神病医生已经死了。*/
died[Crown]=1;
  
/*戴维斯到达精神病医生寓所的时候,精神病医生仍然活着。*/
/*减1表示到达之前的状况*/
died[Davis-1]=0;
/*凶手是在戴维斯之后去精神病医生寓所的。所以Davis离开之前医生仍然活着*/
died[Davis]=0;
  
/*布莱克、戴维斯到之前医生活着,埃弗里、克朗离开之后医生死了*/
/*也就是说埃弗里、克朗不可能在布莱克、戴维斯之前到*/
if(Black>Afred||Black>Crown)return;
if(Davis>Afred||Davis>Crown)return;
  
/*如果死亡状态必须是在活着状态之后,否则不符合*/
/*也就是1如果在0之前就表示这个顺序不对*/
for(i=1;i<=3;i++) if(died[i]>died[i+1])return;  

/*程序能够执行到这里,说明这个顺序是对的。打印出这个顺序*/

/*把名字保存到相应的顺序中去*/
strcpy(name[Afred],"Afred");
strcpy(name[Black],"Black");
strcpy(name[Crown],"Crown");
strcpy(name[Davis],"Davis");
printf("Their sequence to visit the doctor is: \n\n");
for(i=1;i<=4;i++)
printf(" %d: %s, The doctor is %s.\n",i,name[i],died[i]?"died":"alive");
printf("\n Obviously, the murderer is ");
/*died数组中第一次出现1的那个序号就是凶手的序号*/
for(i=1;i<=4;i++)
if(died[i]==1)break;
printf("%s.\n",name[i]);
}



欢迎扫码关注:




转载请注明出自 ,如是转载文则注明原出处,谢谢:)
RSS订阅地址: https://www.felix021.com/blog/feed.php
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   *非必须
网址   电邮   [注册]