爱因斯坦的推理题:
1.有5栋5种颜色的房子
2.每一位房子的主人国籍都不同
3.这五个人每人只喝一个牌子的饮料,只抽一个牌子的香烟,只养一种宠物
4.没有人有相同的宠物,抽相同牌子的烟,喝相同牌子的饮料
已知条件:
1.英国人住在红房子里
2.瑞典人养了一条狗
3.丹麦人喝茶
4.绿房子在白房子的左边
5.绿房子主人喝咖啡
6.抽pallmall烟的人养了一只鸟
7.黄房子主人抽dunhill烟
8.住在中间房子的人喝牛奶
9.挪威人住在第一间房子
10.抽混合烟的人住在养猫人的旁边
11.养马人住在抽dunhill烟人的旁边
12.抽bluemaster烟的人喝啤酒
13.德国人抽prince烟
14.挪威人住在蓝房子旁边
15.抽混合烟的人的邻居喝矿泉水
问题:谁养鱼?
这是世界上最难的一道题之一,爱因斯坦在20世纪初出的这个迷题。他说世界上有98%的人答不出来。今天晚上我在《高中生》上看到这道题,就做了起来。做了半节晚自习,死了我一万个脑细胞。结果让我很失望。刚刚回到家,痛定思痛,我又找到这道题,又开始折磨我的脑细胞。终于发现了问题之所在。问题也迎刃而解。
分析如下。(如果聪明你也有兴趣,就做完了再看我的分析吧。)
因为挪威人住在1→2一定是蓝房子,因为绿房子在白房子的左边所以绿一定不在5白一定不在1,所以挪威人要么住在黄要么住在绿,而绿白两个屋子要挨着所以挪威人只能住在黄色的屋子里面。
挪威人住黄→抽DUN→蓝房子养马。
同时因为3号房喝牛奶而绿房喝咖啡同时绿房子又不能在5所以绿房子一定在4白房子一定在5那么红房子和英国人一定在3并且喝牛奶了。现在来看抽BLENDS香烟的人,因为他的邻居有一个喝水,所以他不可能住在5因为4的绿房子是喝咖啡的,而也不可能在1因为住在1的黄房子是抽DUNHILL的所以只有在2,3,4这3个地方。
先假设抽BLENDS的人在4那么5一定要喝水(因为3喝的是牛奶)现在只有1,2的饮料我们不知道,可是我们知道1是挪威人,而丹麦人是喝茶的,所以挪威人只能喝啤酒,可是喝啤酒的人抽的是BLUEMASTER而挪威人抽的是DUNHILL所以矛盾,故抽BLENDS的人住在4的假设是不成立的。于是假设抽BLENDS的人住在3,同样的因为绿房子的4是喝咖啡的所以只能2喝水。因为1是挪威人所以喝茶的丹麦人只能是5,于是挪威人又只能喝啤酒了,同样矛盾于是我们得出结论抽BLENDS的人一定住在2那么挪威人一定喝水,同时喝茶的丹麦人一定住在2,因为喝啤酒的人是抽BULEMASTER的,他只能住在5。到现在所有饮料都出来了,我们知道德国人抽PRINCE因为住在5的是抽BLUSMASTER的喝啤酒的人所以德国人只能住在4,现在只有3号房不知道抽啥所以住在3号房的英国人只能抽PALL HALL,他一定养鸟,同时我们知道抽BLENDS住在2的人有个养猫的邻居而他3号房的邻居已经养鸟了,所以只能是1号房的挪威人养猫了。又因为5号房的瑞典人养的是狗,于是只能是4号房的德国人养鱼了。按照条件检查一下没有矛盾,证明完毕。
所以顺序为:黄蓝红绿白、挪丹英德瑞、水茶牛咖酒、DUNHILL/BLENDS/pall hall/PRINCE/BLUSMASTER、猫马鸟鱼狗。所以养鱼的是德国人。
哈哈哈哈哈哈哈……开心!!下课回家以后我又想了很久才推理出来。好有成就感啊……
借鉴我最爱的游戏“大富翁”里的一句台词:今夜做梦也会笑~~~
========================================Start========================================
答案1
挪威人丹麦人英国人德国人瑞典人
黄房子蓝房子红房子绿房子白房子
猫马鸟鱼狗
水茶牛奶咖啡啤酒
DUNHILL混合烟PALLMALLPRINCEBLUEMASTER
-------------------------------------------------------------------------------------
答案2
挪威人德国人英国人丹麦人瑞典人
绿房子蓝房子红房子黄房子白房子
鸟猫马鱼狗
咖啡水牛奶茶啤酒
PALLMALLPRINCE混合烟DUNHILLBLUEMASTER
-------------------------------------------------------------------------------------
答案3
挪威人德国人英国人丹麦人瑞典人
绿房子蓝房子红房子黄房子白房子
鸟鱼马猫狗
咖啡水牛奶茶啤酒
PALLMALLPRINCE混合烟DUNHILLBLUEMASTER
-------------------------------------------------------------------------------------
答案4
挪威人德国人瑞典人英国人丹麦人
绿房子蓝房子黄房子红房子白房子
鱼猫狗马鸟
咖啡水牛奶啤酒茶
混合烟PRINCEDUNHILLBLUEMASTERPALLMALL
-------------------------------------------------------------------------------------
答案5
挪威人德国人瑞典人英国人丹麦人
绿房子蓝房子白房子红房子黄房子
鸟猫狗马鱼
咖啡水牛奶啤酒茶
PALLMALLPRINCE混合烟BLUEMASTERDUNHILL
-------------------------------------------------------------------------------------
答案6
挪威人德国人瑞典人丹麦人英国人
绿房子蓝房子白房子黄房子红房子
鸟猫狗鱼马
咖啡水牛奶茶啤酒
PALLMALLPRINCE混合烟DUNHILLBLUEMASTER
-------------------------------------------------------------------------------------
答案7
挪威人德国人瑞典人丹麦人英国人
绿房子蓝房子白房子黄房子红房子
鸟鱼狗猫马
咖啡水牛奶茶啤酒
PALLMALLPRINCE混合烟DUNHILLBLUEMASTER
-------------------------------------------------------------------------------------
========================================End==========================================



/**//*
*
*/
publicclassWhoFeedsFish

...{
privatestaticfinalStringproblem="爱因斯坦的推理题: "
+"1.有5栋5种颜色的房子 "
+"2.每一位房子的主人国籍都不同 "
+"3.这五个人每人只喝一个牌子的饮料,只抽一个牌子的香烟,只养一种宠物 "
+"4.没有人有相同的宠物,抽相同牌子的烟,喝相同牌子的饮料 "
+"已知条件: "
+"1.英国人住在红房子里 "
+"2.瑞典人养了一条狗 "
+"3.丹麦人喝茶 "
+"4.绿房子在白房子的左边 "
+"5.绿房子主人喝咖啡 "
+"6.抽pallmall烟的人养了一只鸟 "
+"7.黄房子主人抽dunhill烟 "
+"8.住在中间房子的人喝牛奶 "
+"9.挪威人住在第一间房子 "
+"10.抽混合烟的人住在养猫人的旁边 "
+"11.养马人住在抽dunhill烟人的旁边 "
+"12.抽bluemaster烟的人喝啤酒 "
+"13.德国人抽prince烟 "
+"14.挪威人住在蓝房子旁边 "
+"15.抽混合烟的人的邻居喝矿泉水 "
+"问题:谁养鱼? ";


/***//**
*@returnReturnstheproblem.
*/
publicStringgetProblem()

...{
returnproblem;
}

privatestaticfinalintNATIONALITY_ENGLISH=1;

privatestaticfinalintNATIONALITY_SWIDISH=2;

privatestaticfinalintNATIONALITY_DAMARK=3;

privatestaticfinalintNATIONALITY_NORWAY=4;

privatestaticfinalintNATIONALITY_GERMAN=5;

privateint[]nationalities=newint[5];

privatestaticfinalintCOLOR_RED=1;

privatestaticfinalintCOLOR_GREEN=2;

privatestaticfinalintCOLOR_YELLOW=3;

privatestaticfinalintCOLOR_WHITE=4;

privatestaticfinalintCOLOR_BLUE=5;

privateint[]colors=newint[5];

privatestaticfinalintPET_DOG=1;

privatestaticfinalintPET_BIRD=2;

privatestaticfinalintPET_CAT=3;

privatestaticfinalintPET_HORSE=4;

privatestaticfinalintPET_FISH=5;

privateint[]pets=newint[5];

privatestaticfinalintDRINK_TEA=1;

privatestaticfinalintDRINK_COFFEE=2;

privatestaticfinalintDRINK_MILK=3;

privatestaticfinalintDRINK_BEER=4;

privatestaticfinalintDRINK_WATER=5;

privateint[]drinks=newint[5];

privatestaticfinalintTOBACCO_PALLMALL=1;

privatestaticfinalintTOBACCO_DUNHILL=2;

privatestaticfinalintTOBACCO_BLUEMASTER=3;

privatestaticfinalintTOBACCO_PRINCE=4;

privatestaticfinalintTOBACCO_MIXED=5;

privateint[]tobaccoes=newint[5];

//5*5的二维数组,答案就在其中:

privateint[][]key=...{nationalities,colors,pets,drinks,tobaccoes};


privatestaticfinalint[][]values=...{

...{1,2,3,4,5},

...{1,2,3,5,4},

...{1,2,4,3,5},

...{1,2,4,5,3},

...{1,2,5,3,4},

...{1,2,5,4,3},

...{1,3,2,4,5},

...{1,3,2,5,4},

...{1,3,4,2,5},

...{1,3,4,5,2},

...{1,3,5,2,4},

...{1,3,5,4,2},

...{1,4,2,3,5},

...{1,4,2,5,3},

...{1,4,3,2,5},

...{1,4,3,5,2},

...{1,4,5,2,3},

...{1,4,5,3,2},

...{1,5,2,3,4},

...{1,5,2,4,3},

...{1,5,3,2,4},

...{1,5,3,4,2},

...{1,5,4,2,3},

...{1,5,4,3,2},

...{2,1,3,4,5},

...{2,1,3,5,4},

...{2,1,4,3,5},

...{2,1,4,5,3},

...{2,1,5,3,4},

...{2,1,5,4,3},

...{2,3,1,4,5},

...{2,3,1,5,4},

...{2,3,4,1,5},

...{2,3,4,5,1},

...{2,3,5,1,4},

...{2,3,5,4,1},

...{2,4,1,3,5},

...{2,4,1,5,3},

...{2,4,3,1,5},

...{2,4,3,5,1},

...{2,4,5,1,3},

...{2,4,5,3,1},

...{2,5,1,3,4},

...{2,5,1,4,3},

...{2,5,3,1,4},

...{2,5,3,4,1},

...{2,5,4,1,3},

...{2,5,4,3,1},

...{3,1,2,4,5},

...{3,1,2,5,4},

...{3,1,4,2,5},

...{3,1,4,5,2},

...{3,1,5,2,4},

...{3,1,5,4,2},

...{3,2,1,4,5},

...{3,2,1,5,4},

...{3,2,4,1,5},

...{3,2,4,5,1},

...{3,2,5,1,4},

...{3,2,5,4,1},

...{3,4,1,2,5},

...{3,4,1,5,2},

...{3,4,2,1,5},

...{3,4,2,5,1},

...{3,4,5,1,2},

...{3,4,5,2,1},

...{3,5,1,2,4},

...{3,5,1,4,2},

...{3,5,2,1,4},

...{3,5,2,4,1},

...{3,5,4,1,2},

...{3,5,4,2,1},

...{4,1,2,3,5},

...{4,1,2,5,3},

...{4,1,3,2,5},

...{4,1,3,5,2},

...{4,1,5,2,3},

...{4,1,5,3,2},

...{4,2,1,3,5},

...{4,2,1,5,3},

...{4,2,3,1,5},

...{4,2,3,5,1},

...{4,2,5,1,3},

...{4,2,5,3,1},

...{4,3,1,2,5},

...{4,3,1,5,2},

...{4,3,2,1,5},

...{4,3,2,5,1},

...{4,3,5,1,2},

...{4,3,5,2,1},

...{4,5,1,2,3},

...{4,5,1,3,2},

...{4,5,2,1,3},

...{4,5,2,3,1},

...{4,5,3,1,2},

...{4,5,3,2,1},

...{5,1,2,3,4},

...{5,1,2,4,3},

...{5,1,3,2,4},

...{5,1,3,4,2},

...{5,1,4,2,3},

...{5,1,4,3,2},

...{5,2,1,3,4},

...{5,2,1,4,3},

...{5,2,3,1,4},

...{5,2,3,4,1},

...{5,2,4,1,3},

...{5,2,4,3,1},

...{5,3,1,2,4},

...{5,3,1,4,2},

...{5,3,2,1,4},

...{5,3,2,4,1},

...{5,3,4,1,2},

...{5,3,4,2,1},

...{5,4,1,2,3},

...{5,4,1,3,2},

...{5,4,2,1,3},

...{5,4,2,3,1},

...{5,4,3,1,2},

...{5,4,3,2,1}
};

publicvoidprintKey()

...{
for(inti=0;i<5;i++)

...{
print("nationality",key[0][i]);
}

System.out.println();
for(inti=0;i<5;i++)

...{
print("color",key[1][i]);
}
System.out.println();
for(inti=0;i<5;i++)

...{
print("pet",key[2][i]);
}
System.out.println();
for(inti=0;i<5;i++)

...{
print("drink",key[3][i]);
}
System.out.println();
for(inti=0;i<5;i++)

...{
print("tobacco",key[4][i]);
}
System.out.println();
}


/***//**
*
*@paramitem
*@paramindex
*/
privatevoidprint(Stringitem,intindex)

...{
if(false)

...{
}
elseif("nationality".equals(item))

...{
switch(index)

...{
case1:
System.out.print("英国人 ");
break;
case2:
System.out.print("瑞典人 ");
break;
case3:
System.out.print("丹麦人 ");
break;
case4:
System.out.print("挪威人 ");
break;
case5:
System.out.print("德国人 ");
break;
}
}
elseif("color".equals(item))

...{
switch(index)

...{
case1:
System.out.print("红房子 ");
break;
case2:
System.out.print("绿房子 ");
break;
case3:
System.out.print("黄房子 ");
break;
case4:
System.out.print("白房子 ");
break;
case5:
System.out.print("蓝房子 ");
break;
}
}
elseif("pet".equals(item))

...{
switch(index)

...{
case1:
System.out.print("狗 ");
break;
case2:
System.out.print("鸟 ");
break;
case3:
System.out.print("猫 ");
break;
case4:
System.out.print("马 ");
break;
case5:
System.out.print("鱼 ");
break;
}
}
elseif("drink".equals(item))

...{
switch(index)

...{
case1:
System.out.print("茶 ");
break;
case2:
System.out.print("咖啡 ");
break;
case3:
System.out.print("牛奶 ");
break;
case4:
System.out.print("啤酒 ");
break;
case5:
System.out.print("水 ");
break;
}
}
elseif("tobacco".equals(item))

...{
switch(index)

...{
case1:
System.out.print("PALLMALL ");
break;
case2:
System.out.print("DUNHILL ");
break;
case3:
System.out.print("BLUEMASTER ");
break;
case4:
System.out.print("PRINCE ");
break;
case5:
System.out.print("混合烟 ");
break;
}
}
}

//条件1:英国人住在红房子里01
privatebooleancheck01()

...{
for(inti=0;i<nationalities.length;i++)

...{
if(key[0][i]==NATIONALITY_ENGLISH)

...{
if(key[1][i]!=COLOR_RED)

...{
returnfalse;
}
else

...{
returntrue;
}
}
}
returnfalse;
}

//条件2:瑞典人养了一条狗02
privatebooleancheck02()

...{
for(inti=0;i<nationalities.length;i++)

...{
if(key[0][i]==NATIONALITY_SWIDISH)

...{
if(key[2][i]!=PET_DOG)

...{
returnfalse;
}
else

...{
returntrue;
}
}
}
returnfalse;
}

//条件4:绿房子在白房子的左边1
privatebooleancheck1()

...{
for(inti=0;i<colors.length;i++)

...{
if(key[1][i]==COLOR_GREEN)

...{
for(intj=0;j<colors.length;j++)

...{
if(key[1][j]==COLOR_WHITE)

...{
if(i>j)

...{
returnfalse;
}
else

...{
returntrue;
}
}
}
}
}
returnfalse;
}

//条件8:住在中间房子的人喝牛奶3
privatebooleancheck3()

...{
returnkey[3][2]==DRINK_MILK?true:false;
}

//条件9:挪威人住在第一间房子0
privatebooleancheck0()

...{
if(key[0][0]!=NATIONALITY_NORWAY)

...{
returnfalse;
}
returntrue;
}

//14.挪威人住在蓝房子旁边01
privatebooleancheck011()

...{
for(inti=0;i<nationalities.length;i++)

...{
if(key[0][i]==NATIONALITY_NORWAY)

...{
for(intj=0;j<colors.length;j++)

...{
if(key[1][j]==COLOR_BLUE)

...{
if(Math.abs(i-j)==1)

...{
returntrue;
}
else

...{
returnfalse;
}
}
}
}
}
returnfalse;
}

///////////////////////////////////////////////////////////////////
//条件1,2,3,4,8,9,14被拿出来提前检测(预检测以去除不必要的操作,减少执行时间)
privatebooleancheck()

...{
//条件3:丹麦人喝茶03
for(inti=0;i<nationalities.length;i++)

...{
if(key[0][i]==NATIONALITY_DAMARK)

...{
if(key[3][i]!=DRINK_TEA)

...{
returnfalse;
}
else

...{
break;
}
}
}
//条件5:绿房子主人喝咖啡13
for(inti=0;i<colors.length;i++)

...{
if(key[1][i]==COLOR_GREEN)

...{
if(key[3][i]!=DRINK_COFFEE)

...{
returnfalse;
}
else

...{
break;
}
}
}
//条件6:抽pallmall烟的人养了一只鸟24
for(inti=0;i<tobaccoes.length;i++)

...{
if(key[4][i]==TOBACCO_PALLMALL)

...{
if(key[2][i]!=PET_BIRD)

...{
returnfalse;
}
else

...{
break;
}
}
}
//条件7:黄房子主人抽dunhill烟14
for(inti=0;i<colors.length;i++)

...{
if(key[1][i]==COLOR_YELLOW)

...{
if(key[4][i]!=TOBACCO_DUNHILL)

...{
returnfalse;
}
else

...{
break;
}
}
}
//条件10:抽混合烟的人住在养猫人的旁边24
for(inti=0;i<tobaccoes.length;i++)

...{
if(key[4][i]==TOBACCO_MIXED)

...{
for(intj=0;j<pets.length;j++)

...{
if(key[2][j]==PET_CAT)

...{
if(i-j!=1&&i-j!=-1)

...{
returnfalse;
}
break;
}
}
break;
}
}
//条件11:养马人住在抽dunhill烟人的旁边24
for(inti=0;i<pets.length;i++)

...{
if(key[2][i]==PET_HORSE)

...{
for(intj=0;j<tobaccoes.length;j++)

...{
if(key[4][j]==TOBACCO_DUNHILL)

...{
if(i-j!=1&&i-j!=-1)

...{
returnfalse;
}
break;
}
}
break;
}
}
//条件12:抽bluemaster烟的人喝啤酒34
for(inti=0;i<tobaccoes.length;i++)

...{
if(key[4][i]==TOBACCO_BLUEMASTER)

...{
if(key[3][i]!=DRINK_BEER)

...{
returnfalse;
}
else

...{
break;
}
}
}
//13.德国人抽prince烟04
for(inti=0;i<nationalities.length;i++)

...{
if(key[0][i]==NATIONALITY_GERMAN)

...{
if(key[4][i]!=TOBACCO_PRINCE)

...{
returnfalse;
}
else

...{
break;
}
}
}
//15.抽混合烟的人的邻居喝矿泉水34
for(inti=0;i<tobaccoes.length;i++)

...{
if(key[4][i]==TOBACCO_MIXED)

...{
for(intj=0;j<drinks.length;j++)

...{
if(key[3][j]==DRINK_WATER)

...{
if((i-j!=1)&&(i-j!=-1))

...{
returnfalse;
}
else

...{
break;
}
}
}
break;
}
}
//满足所有条件:
returntrue;
}


/***//**
*
*
*/
publicvoidrun()

...{
intcount=0;
for(inta=0;a<120;a++)

...{
for(inti=0;i<5;i++)

...{
key[0][i]=values[a][i];
}
if(!check0())

...{
continue;
}
for(intb=0;b<120;b++)

...{
for(inti=0;i<5;i++)

...{
key[1][i]=values[b][i];
}
if(!check01()||!check011()||!check1())

...{
continue;
}
for(intc=0;c<120;c++)

...{
for(inti=0;i<5;i++)

...{
key[2][i]=values[c][i];
}
if(!check02())

...{
continue;
}
for(intd=0;d<120;d++)

...{
for(inti=0;i<5;i++)

...{
key[3][i]=values[d][i];
}
if(!check3())

...{
continue;
}
for(inte=0;e<120;e++)

...{
for(inti=0;i<5;i++)

...{
key[4][i]=values[e][i];
}
if(!check())

...{
continue;
}
System.out.println("答案"+(++count));
printKey();
System.out.println("-----------------------------------------------"+"--------------------------------------");
}
}
}
}
}
}


/***//**
*
*@paramargs
*/
publicstaticvoidmain(String[]args)

...{
WhoFeedsFishwff=newWhoFeedsFish();
System.out.println(wff.getProblem());
System.out.println("========================================Start========================================");
wff.run();
System.out.println("========================================End==========================================");
}
}


