爱因斯坦出的一道逻辑推理题

1、有5幢5种颜色的房子;
2、每一位房子的主人国籍都不同;
3、5个人每人只喝一种饮料、只抽一个牌子的香烟、养一种宠物;
4、没有人有相同的宠物、抽相同牌子的香烟、喝相同牌子的饮料;
提示:
1、英国人住红房子;
2、瑞典人养狗;
3、丹麦人喝茶;
4、绿房子在白房子左边;
5、绿房子的主人喝咖啡;
6、抽PALL MALL烟的养鸟;
7、黄房子的主人抽DUNHILL烟;
8、住中间房子的人喝牛奶;9挪威人住第一间房子;
10、抽混合烟的人住养猫人旁边;
11、养马人住抽DUNHILL烟的人旁边;
12、抽BLUE MASTER烟的人住养马人旁边;
13、德国人抽DRINCE烟;
14、挪威人住蓝房子旁边;
15、抽混合烟的人的邻居喝矿泉水。
问题:谁养鱼?
(写出详细过程)

偶晕。。偶倒。。。。。偶扶墙。。。。。。。

咳。。题有一点小错误。。。。。。。。

12、抽BLUE MASTER烟的人住养马人旁边;
应该是:
12、抽Blue Master的人喝啤酒

—_—

先从房子入手:
∵9挪威人住第一间房子;14、挪威人住蓝房子旁边;
∴第2间房是蓝色
∵4、绿房子在白房子左边;5、绿房子的主人喝咖啡;8、住中间房子的人喝牛奶;
∴绿房子是第4间,白房子是第5间
∵1、英国人住红房子;而第1间是挪威人
∴英国人的红房子是第3间,剩下的黄房子则是挪威人的
目前顺序:黄 蓝 红 绿 白

再来是房子主人的国籍:
根据条件已知:第1间是挪威人,第3间是英国人
∵7、黄房子的主人抽DUNHILL烟;11、养马人住抽DUNHILL烟的人旁边;
∴蓝房子的人养马。
∵6、抽PALL MALL烟的养鸟;2、瑞典人养狗;13、德国人抽DRINCE烟;7、黄房子的主人(挪威人)抽DUNHILL烟;蓝房子的人养马。
∴英国人抽PALL MALL烟
∵2、瑞典人养狗;
∴蓝房子的主人只有可能是德国人或丹麦人
∵3、丹麦人喝茶;5、绿房子的主人喝咖啡;
∴蓝房子的主人丹麦人。
绿房子的主人有可能是德国人或瑞典人。
∵12、抽Blue Master的人喝啤酒,13、德国人抽DRINCE烟;英国人抽BLUE MASTER烟,7、黄房子的主人(挪威人)抽DUNHILL烟;5、绿房子的主人喝咖啡;
∴绿房子主人不可能抽Blue Master,BLUE MASTER,DUNHILL烟,
抽混合烟的只有可能是瑞典人和丹麦人
∵12、抽Blue Master的人喝啤酒,3、丹麦人喝茶;
∴抽Blue Master的是瑞典人,丹麦人抽混合烟。(倒.....做到这儿就把每个人抽的烟给算出来了)
∵抽Blue Master(瑞典人)的人喝啤酒,而5、绿房子的主人喝咖啡;
∴瑞典人是第5间房子,绿房子的主人则是德国人

主人国籍的顺序:挪威人 丹麦人 英国人 德国人 瑞典人
顺便把烟的顺序记下(—_—):DUNHILL烟 混合烟 PALL MALL烟 DRINCE烟 Blue Master烟

接着是饮料:
根据条件已知:绿房子的主人(德国人)喝咖啡;住中间房子的人(英国人)喝牛奶;丹麦人喝茶;
∵15、抽混合烟的人的邻居喝矿泉水;(丹麦人抽混合烟)
∴挪威人喝矿泉水
∵12、抽Blue Master的人喝啤酒;(瑞典人抽Blue Master烟)
∴瑞典人喝啤酒

饮料顺序:矿泉水 茶 牛奶 咖啡 啤酒

最后是宠物:(靠....真是麻烦...)
根据条件已知:瑞典人养狗;
∵6、抽PALL MALL烟的养鸟;(英国人抽PALL MALL烟)
∴英国人养鸟
∵10、抽混合烟的人住养猫人旁边(丹麦人抽混合烟);英国人养鸟
∴挪威人养猫
∵7、黄房子的主人(挪威人)抽DUNHILL烟;11、养马人住抽DUNHILL烟的人旁边;
∴蓝色房子(丹麦人)养马
剩下只有德国人养的宠物有可能是鱼
顺序则是:猫 马 鸟 鱼 狗

顺序:
⒈黄 挪威人 DUNHILL烟 矿泉水 猫
⒉蓝 丹麦人 混合烟 茶 马
⒊红 英国人 PALL MALL烟 牛奶 鸟
⒋绿 德国人 DRINCE烟 咖啡 鱼
⒌白 瑞典人 Blue Master烟 啤酒 狗

呼。。。。。。。。。搞定。。:)
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-11-23
呃~~~~其实解这到题要先从他们的房子入手~~~~~~~~~~~~~~
根据:9 挪威人住第一间房子,14 挪威人住在蓝房子旁边,1 英国人住在红房子里,4 绿房子在白房子左边。可以看出挪威人是住的第1间房子,第一间房子的旁边只能是第2间房子,所以可以知道第2间是蓝色房子,绿色房子在白色房子的左边,那么绿色房子只能是第3.4间。
8 住在中间那间房子的人喝牛奶,5 绿房子主人喝咖啡,可以看出第3间房子不是绿色房子,那么绿色房子便只能是第4间,白色的房子在它的右边,也就是第5座房子。
接下来再看第一座房子与第3座房子颜色,1 英国人住在红房子里,而第1座房子是挪威人的,所以得出英国人住的红房子在第3座。剩下的一座只有是挪威人住的黄色房子。
那么现在的顺序就是:1.黄色房子,2.蓝色房子,3.红色房子,4.绿色房子,5.白色房子。

推理出房子的顺序后其余的简单多了,最后是德国人在养鱼,详细的推理过程:http://post.baidu.com/f?kz=10301755你到这里面慢慢看吧~~~~

1、挪威人,黄色房子,Dunhill,喝矿泉水水,养猫
2、丹麦人,蓝色房子,混合烟,喝茶,养马
3、英国人,红色房子,Pall Mall ,喝牛奶,养鸟
4、德国人,绿色房子,Prince,喝咖啡,养鱼
5、瑞典人,白色房子,Blue Master,喝啤酒,养狗本回答被提问者采纳
第2个回答  2007-01-31
ou原来这个问题是爱因斯坦出的,我牺牲了一节课也没做出来
第3个回答  2007-02-03
不能一会儿用口算出来,直接在网上搜得了下面资料
1 2 3 4 5
挪威 丹麦 英国 德国 瑞典
黄色 蓝色 红色 绿色 白色
Dunhill Blend pall mall prinee bine msier
开水 茶 牛奶 咖啡 啤酒
猫 马 鸟 鱼 狗

#include <iostream.h>

char* people[5] = {NULL};
char* color[5] = {NULL};
char* smoke[5] = {NULL};
char* drink[5] = {NULL};
char* pet[5] = {NULL};

/*
char* people[] = {"挪威","丹麦","英国","德国","瑞典"};
char* color[] = {"黄色","蓝色","红色","绿色","白色"};
char* smoke[] = {"Dunhill","Blend","Pall Mall","Prinee","Bine Masier"};
char* drink[] = {"开水","茶","牛奶","咖啡","啤酒"};
char* pet[] = {"猫","马","鸟","鱼","狗"};
*/

void print_single_result(const char* remark, char* a[])
{
cout << remark << endl;
for( int i = 0; i < 5; i ++ )
{
if( NULL == a[i] )
cout << "NULL";
else
cout << a[i];
cout << "\t" << flush;
}
cout << endl;
}

void print_result()
{
print_single_result("people", people);
print_single_result("color", color);
print_single_result("smoke", smoke);
print_single_result("drink", drink);
print_single_result("pet", pet);
}

int foo(const int level);

int main()
{
if( 0 == foo(0) )
{
print_result();
}
return 0;
}

Top

{
/*
0. (drink[2]=="牛奶")
1. (people[0]=="挪威")
2. (people[i]=="英国"&&color[i]=="红色")
3. (people[i]=="瑞典"&&pet[i]=="狗")
4. (people[i]=="丹麦"&&drink[i]=="茶")
5. (color[i]=="绿色"&&drink[i]=="咖啡")
6. (smoke[i]=="Bine Masier"&&drink[i]=="啤酒")
7. (smoke[i]=="Pall Mall"&&pet[i]=="鸟")
8. (color[i]=="黄色"&&smoke[i]=="Dunhill")
9. (people[i]=="德国"&&smoke[i]=="Prinee")
10. (color[i]=="绿色"&&color[j]=="白色"&&(i<j))
11. (smoke[i]=="Dunhill"&&pet[j]=="马"&&(i=j-1||i=j+1))
12. (smoke[i]=="Blend"&&pet[j]=="猫"&&(i=j-1||i=j+1))
13. (people[i]=="挪威"&&color[j]=="蓝色"&&(i=j-1||i=j+1))
14. (drink[i]=="开水"&&smoke[j]=="Blend"&&(i=j-1||i=j+1))
*/
switch(level)
{
case 0 :
{
int isNull = 0;
if( drink[2] != NULL && strcmp(drink[2],"牛奶") ) return 1;
if( drink[2] == NULL ) isNull = 1;
if( isNull ) drink[2] = "牛奶";
if( 0 == foo(level+1) ) return 0;
if( isNull ) drink[2] = NULL;
return 1;
}
break;
case 1 :
{
int isNull = 0;
if( people[0] != NULL && strcmp(people[0],"挪威") ) return 1;
if( people[0] == NULL ) isNull = 1;
if( isNull ) people[0] = "挪威";
if( 0 == foo(level+1) ) return 0;
if( isNull ) people[0] = NULL;
return 1;
}
break;
case 2 :
{
int i = 0;
for( i = 0; i < 5; i ++ )
{
int isNull1=0, isNull2=0;
if( people[i] != NULL && strcmp(people[i],"英国") ) continue;
if( color[i] != NULL && strcmp(color[i],"红色") ) continue;
if( people[i] == NULL ) isNull1 = 1;
if( color[i] == NULL ) isNull2 = 1;
if( isNull1 ) people[i] = "英国";
if( isNull2 ) color[i] = "红色";
if( 0 == foo(level+1) ) return 0;
if( isNull1 ) people[i] = NULL;
if( isNull2 ) color[i] = NULL;
}
return 1;
}
break;
case 3 :
{
int i = 0;
for( i = 0; i < 5; i ++ )
{
int isNull1=0, isNull2=0;
if( people[i] != NULL && strcmp(people[i],"瑞典") ) continue;
if( pet[i] != NULL && strcmp(pet[i],"狗") ) continue;
if( people[i] == NULL ) isNull1 = 1;
if( pet[i] == NULL ) isNull2 = 1;
if( isNull1 ) people[i] = "瑞典";
if( isNull2 ) pet[i] = "狗";
if( 0 == foo(level+1) ) return 0;
if( isNull1 ) people[i] = NULL;
if( isNull2 ) pet[i] = NULL;
}
return 1;
}
break;
case 4 :
{
int i = 0;
for( i = 0; i < 5; i ++ )
{
int isNull1=0, isNull2=0;
if( people[i] != NULL && strcmp(people[i],"丹麦") ) continue;
if( drink[i] != NULL && strcmp(drink[i],"茶") ) continue;
if( people[i] == NULL ) isNull1 = 1;
if( drink[i] == NULL ) isNull2 = 1;
if( isNull1 ) people[i] = "丹麦";
if( isNull2 ) drink[i] = "茶";
if( 0 == foo(level+1) ) return 0;
if( isNull1 ) people[i] = NULL;
if( isNull2 ) drink[i] = NULL;
}
return 1;
}
break;

Top

{
int i = 0;
for( i = 0; i < 5; i ++ )
{
int isNull1=0, isNull2=0;
if( color[i] != NULL && strcmp(color[i],"绿色") ) continue;
if( drink[i] != NULL && strcmp(drink[i],"咖啡") ) continue;
if( color[i] == NULL ) isNull1 = 1;
if( drink[i] == NULL ) isNull2 = 1;
if( isNull1 ) color[i] = "绿色";
if( isNull2 ) drink[i] = "咖啡";
if( 0 == foo(level+1) ) return 0;
if( isNull1 ) color[i] = NULL;
if( isNull2 ) drink[i] = NULL;
}
return 1;
}
break;
case 6 :
{
int i = 0;
for( i = 0; i < 5; i ++ )
{
int isNull1=0, isNull2=0;
if( smoke[i] != NULL && strcmp(smoke[i],"Bine Masier") ) continue;
if( drink[i] != NULL && strcmp(drink[i],"啤酒") ) continue;
if( smoke[i] == NULL ) isNull1 = 1;
if( drink[i] == NULL ) isNull2 = 1;
if( isNull1 ) smoke[i] = "Bine Masier";
if( isNull2 ) drink[i] = "啤酒";
if( 0 == foo(level+1) ) return 0;
if( isNull1 ) smoke[i] = NULL;
if( isNull2 ) drink[i] = NULL;
}
return 1;
}
break;
case 7 :
{
int i = 0;
for( i = 0; i < 5; i ++ )
{
int isNull1=0, isNull2=0;
if( smoke[i] != NULL && strcmp(smoke[i],"Pall Mall") ) continue;
if( pet[i] != NULL && strcmp(pet[i],"鸟") ) continue;
if( smoke[i] == NULL ) isNull1 = 1;
if( pet[i] == NULL ) isNull2 = 1;
if( isNull1 ) smoke[i] = "Pall Mall";
if( isNull2 ) pet[i] = "鸟";
if( 0 == foo(level+1) ) return 0;
if( isNull1 ) smoke[i] = NULL;
if( isNull2 ) pet[i] = NULL;
}
return 1;
}
break;
case 8 :
{
int i = 0;
for( i = 0; i < 5; i ++ )
{
int isNull1=0, isNull2=0;
if( color[i] != NULL && strcmp(color[i],"黄色") ) continue;
if( smoke[i] != NULL && strcmp(smoke[i],"Dunhill") ) continue;
if( color[i] == NULL ) isNull1 = 1;
if( smoke[i] == NULL ) isNull2 = 1;
if( isNull1 ) color[i] = "黄色";
if( isNull2 ) smoke[i] = "Dunhill";
if( 0 == foo(level+1) ) return 0;
if( isNull1 ) color[i] = NULL;
if( isNull2 ) smoke[i] = NULL;
}
return 1;
}
break;
case 9 :
{
int i = 0;
for( i = 0; i < 5; i ++ )
{
int isNull1=0, isNull2=0;
if( people[i] != NULL && strcmp(people[i],"德国") ) continue;
if( smoke[i] != NULL && strcmp(smoke[i],"Prinee") ) continue;
if( people[i] == NULL ) isNull1 = 1;
if( smoke[i] == NULL ) isNull2 = 1;
if( isNull1 ) people[i] = "德国";
if( isNull2 ) smoke[i] = "Prinee";
if( 0 == foo(level+1) ) return 0;
if( isNull1 ) people[i] = NULL;
if( isNull2 ) smoke[i] = NULL;
}
return 1;
}
break;

Top

{
int i = 0;
for( i = 0; i < 5; i ++ )
{
int isNull1=0;
if( color[i] != NULL && strcmp(color[i],"绿色") ) continue;
if( color[i] == NULL ) isNull1 = 1;
if( isNull1 ) color[i] = "绿色";
int j;
for( j = i+1; j < 5; j ++ )
{
int isNull2=0;
if( color[j] != NULL && strcmp(color[j],"白色") ) continue;
if( color[j] == NULL ) isNull2 = 1;
if( isNull2 ) color[j] = "白色";
if( 0 == foo(level+1) ) return 0;
if( isNull2 ) color[j] = NULL;
}
if( isNull1 ) color[i] = NULL;
}
return 1;
}
break;
case 11 :
{
int i = 0;
for( i = 0; i < 5; i ++ )
{
int isNull1=0;
if( smoke[i] != NULL && strcmp(smoke[i],"Dunhill") ) continue;
if( smoke[i] == NULL ) isNull1 = 1;
if( isNull1 ) smoke[i] = "Dunhill";
if( i-1>=0 )
{
int j = i-1;
int isNull2=0;
if( pet[j] == NULL || !strcmp(pet[j],"马") )
{
if( pet[j] == NULL ) isNull2 = 1;
if( isNull2 ) pet[j] = "马";
if( 0 == foo(level+1) ) return 0;
if( isNull2 ) pet[j] = NULL;
}
}
if( i+1<=4 )
{
int j = i+1;
int isNull2=0;
if( pet[j] == NULL || !strcmp(pet[j],"马") )
{
if( pet[j] == NULL ) isNull2 = 1;
if( isNull2 ) pet[j] = "马";
if( 0 == foo(level+1) ) return 0;
if( isNull2 ) pet[j] = NULL;
}
}
if( isNull1 ) smoke[i] = NULL;
}
return 1;
}
break;
case 12 :
{
int i = 0;
for( i = 0; i < 5; i ++ )
{
int isNull1=0;
if( smoke[i] != NULL && strcmp(smoke[i],"Blend") ) continue;
if( smoke[i] == NULL ) isNull1 = 1;
if( isNull1 ) smoke[i] = "Blend";
if( i-1>=0 )
{
int j = i-1;
int isNull2=0;
if( pet[j] == NULL || !strcmp(pet[j],"猫") )
{
if( pet[j] == NULL ) isNull2 = 1;
if( isNull2 ) pet[j] = "猫";
if( 0 == foo(level+1) ) return 0;
if( isNull2 ) pet[j] = NULL;
}
}
if( i+1<=4 )
{
int j = i+1;
int isNull2=0;
if( pet[j] == NULL || !strcmp(pet[j],"猫") )
{
if( pet[j] == NULL ) isNull2 = 1;
if( isNull2 ) pet[j] = "猫";
if( 0 == foo(level+1) ) return 0;
if( isNull2 ) pet[j] = NULL;
}
}
if( isNull1 ) smoke[i] = NULL;
}
return 1;
}
break;
case 13 :
{
int i = 0;
for( i = 0; i < 5; i ++ )
{
int isNull1=0;
if( people[i] != NULL && strcmp(people[i],"挪威") ) continue;
if( people[i] == NULL ) isNull1 = 1;
if( isNull1 ) people[i] = "挪威";
if( i-1>=0 )
{
int j = i-1;
int isNull2=0;
if( color[j] == NULL || !strcmp(color[j],"蓝色") )
{
if( color[j] == NULL ) isNull2 = 1;
if( isNull2 ) color[j] = "蓝色";
if( 0 == foo(level+1) ) return 0;
if( isNull2 ) color[j] = NULL;
}
}
if( i+1<=4 )
{
int j = i+1;
int isNull2=0;
if( color[j] == NULL || !strcmp(color[j],"蓝色") )
{
if( color[j] == NULL ) isNull2 = 1;
if( isNull2 ) color[j] = "蓝色";
if( 0 == foo(level+1) ) return 0;
if( isNull2 ) color[j] = NULL;
}
}
if( isNull1 ) people[i] = NULL;
}
return 1;
}
break;
case 14 :
{
int i = 0;
for( i = 0; i < 5; i ++ )
{
int isNull1=0;
if( drink[i] != NULL && strcmp(drink[i],"开水") ) continue;
if( drink[i] == NULL ) isNull1 = 1;
if( isNull1 ) drink[i] = "开水";
if( i-1>=0 )
{
int j = i-1;
int isNull2=0;
if( smoke[j] == NULL || !strcmp(smoke[j],"Blend") )
{
if( smoke[j] == NULL ) isNull2 = 1;
if( isNull2 ) smoke[j] = "Blend";
return 0;
}
}
if( i+1<=4 )
{
int j = i+1;
int isNull2=0;
if( smoke[j] == NULL || !strcmp(smoke[j],"Blend") )
{
if( smoke[j] == NULL ) isNull2 = 1;
if( isNull2 ) smoke[j] = "Blend";
return 0;
}
}
if( isNull1 ) drink[i] = NULL;
}
return 1;
}
break;
default :
break;
}
return 1;
}
第4个回答  2018-05-28
你这题提示第12个写错了,哎呀,你这题都解不出来
相似回答