爱因斯坦谜题的java解答方法

本文解析了爱因斯坦提出的一个著名推理题,通过逻辑推理确定了每栋房子的颜色、主人国籍、宠物、饮料和香烟品牌等信息,并最终得出养鱼者的身份。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

爱因斯坦的推理题:

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==========================================");
}

}





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值