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

爱因斯坦的推理题:

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%的人答不出来。今天晚上我在《高中生》上看到这道题,就做了起来。做了半节晚自习,死了我一万个脑细胞。结果让我很失望。刚刚回到家,痛定思痛,我又找到这道题,又开始折磨我的脑细胞。终于发现了问题之所在。问题也迎刃而解。

分析如下。(如果聪明你也有兴趣,就做完了再看我的分析吧。)

因为挪威人住在12一定是蓝房子,因为绿房子在白房子的左边所以绿一定不在5白一定不在1,所以挪威人要么住在黄要么住在绿,而绿白两个屋子要挨着所以挪威人只能住在黄色的屋子里面。

挪威人住黄→抽DUN→蓝房子养马。

同时因为3号房喝牛奶而绿房喝咖啡同时绿房子又不能在5所以绿房子一定在4白房子一定在5那么红房子和英国人一定在3并且喝牛奶了。现在来看抽BLENDS香烟的人,因为他的邻居有一个喝水,所以他不可能住在5因为4的绿房子是喝咖啡的,而也不可能在1因为住在1的黄房子是抽DUNHILL的所以只有在2343个地方。

先假设抽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        混合烟        PALLMALL        PRINCE        BLUEMASTER        
-------------------------------------------------------------------------------------
答案2
挪威人        德国人        英国人        丹麦人        瑞典人        
绿房子        蓝房子        红房子        黄房子        白房子        
鸟        猫        马        鱼        狗        
咖啡        水        牛奶        茶        啤酒        
PALLMALL        PRINCE        混合烟        DUNHILL        BLUEMASTER        
-------------------------------------------------------------------------------------
答案3
挪威人        德国人        英国人        丹麦人        瑞典人        
绿房子        蓝房子        红房子        黄房子        白房子        
鸟        鱼        马        猫        狗        
咖啡        水        牛奶        茶        啤酒        
PALLMALL        PRINCE        混合烟        DUNHILL        BLUEMASTER        
-------------------------------------------------------------------------------------
答案4
挪威人        德国人        瑞典人        英国人        丹麦人        
绿房子        蓝房子        黄房子        红房子        白房子        
鱼        猫        狗        马        鸟        
咖啡        水        牛奶        啤酒        茶        
混合烟        PRINCE        DUNHILL        BLUEMASTER        PALLMALL        
-------------------------------------------------------------------------------------
答案5
挪威人        德国人        瑞典人        英国人        丹麦人        
绿房子        蓝房子        白房子        红房子        黄房子        
鸟        猫        狗        马        鱼        
咖啡        水        牛奶        啤酒        茶        
PALLMALL        PRINCE        混合烟        BLUEMASTER        DUNHILL        
-------------------------------------------------------------------------------------
答案6
挪威人        德国人        瑞典人        丹麦人        英国人        
绿房子        蓝房子        白房子        黄房子        红房子        
鸟        猫        狗        鱼        马        
咖啡        水        牛奶        茶        啤酒        
PALLMALL        PRINCE        混合烟        DUNHILL        BLUEMASTER        
-------------------------------------------------------------------------------------
答案7
挪威人        德国人        瑞典人        丹麦人        英国人        
绿房子        蓝房子        白房子        黄房子        红房子        
鸟        鱼        狗        猫        马        
咖啡        水        牛奶        茶        啤酒        
PALLMALL        PRINCE        混合烟        DUNHILL        BLUEMASTER        
-------------------------------------------------------------------------------------
========================================End==========================================

 



/*
 *
 
*/

public   class  WhoFeedsFish
{
    
private static final String problem = "爱因斯坦的推理题: "
                        
+"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.抽混合烟的人的邻居喝矿泉水 "
                        
+"问题:谁养鱼? ";               

    
/**         
     * 
@return Returns the problem.         
     
*/

    
public String getProblem()
    
{
        
return problem;
    }


    
private static final int NATIONALITY_ENGLISH = 1;

    
private static final int NATIONALITY_SWIDISH = 2;

    
private static final int NATIONALITY_DAMARK = 3;

    
private static final int NATIONALITY_NORWAY = 4;

    
private static final int NATIONALITY_GERMAN = 5;

    
private int[] nationalities = new int[5];

    
private static final int COLOR_RED = 1;

    
private static final int COLOR_GREEN = 2;

    
private static final int COLOR_YELLOW = 3;

    
private static final int COLOR_WHITE = 4;

    
private static final int COLOR_BLUE = 5;

    
private int[] colors = new int[5];

    
private static final int PET_DOG = 1;

    
private static final int PET_BIRD = 2;

    
private static final int PET_CAT = 3;

    
private static final int PET_HORSE = 4;

    
private static final int PET_FISH = 5;

    
private int[] pets = new int[5];

    
private static final int DRINK_TEA = 1;

    
private static final int DRINK_COFFEE = 2;

    
private static final int DRINK_MILK = 3;

    
private static final int DRINK_BEER = 4;

    
private static final int DRINK_WATER = 5;

    
private int[] drinks = new int[5];

    
private static final int TOBACCO_PALLMALL = 1;

    
private static final int TOBACCO_DUNHILL = 2;

    
private static final int TOBACCO_BLUEMASTER = 3;

    
private static final int TOBACCO_PRINCE = 4;

    
private static final int TOBACCO_MIXED = 5;

    
private int[] tobaccoes = new int[5];

    
//5*5的二维数组,答案就在其中:        
    private int[][] key = { nationalities, colors, pets, drinks, tobaccoes };

    
private static final int[][] values = 
            
12345 },
            
12354 }
            
12435 }
            
12453 },
            
12534 }
            
12543 }
            
13245 },
            
13254 }
            
13425 }
            
13452 },
            
13524 }
            
13542 }
            
14235 },
            
14253 }
            
14325 }
            
14352 },
            
14523 }
            
14532 }
            
15234 },
            
15243 }
            
15324 }
            
15342 },
            
15423 }
            
15432 }
            
21345 },
            
21354 }
            
21435 }
            
21453 },
            
21534 }
            
21543 }
            
23145 },
            
23154 }
            
23415 }
            
23451 },
            
23514 }
            
23541 }
            
24135 },
            
24153 }
            
24315 }
            
24351 },
            
24513 }
            
24531 }
            
25134 },
            
25143 }
            
25314 }
            
25341 },
            
25413 }
            
25431 }
            
31245 },
            
31254 }
            
31425 }
            
31452 },
            
31524 }
            
31542 }
            
32145 },
            
32154 }
            
32415 }
            
32451 },
            
32514 }
            
32541 }
            
34125 },
            
34152 }
            
34215 }
            
34251 },
            
34512 }
            
34521 }
            
35124 },
            
35142 }
            
35214 }
            
35241 },
            
35412 }
            
35421 }
            
41235 },
            
41253 }
            
41325 }
            
41352 },
            
41523 }
            
41532 }
            
42135 },
            
42153 }
            
42315 }
            
42351 },
            
42513 }
            
42531 }
            
43125 },
            
43152 }
            
43215 }
            
43251 },
            
43512 }
            
43521 }
            
45123 },
            
45132 }
            
45213 }
            
45231 },
            
45312 }
            
45321 }
            
51234 },
            
51243 }
            
51324 }
            
51342 },
            
51423 }
            
51432 }
            
52134 },
            
52143 }
            
52314 }
            
52341 },
            
52413 }
            
52431 }
            
53124 },
            
53142 }
            
53214 }
            
53241 },
            
53412 }
            
53421 }
            
54123 },
            
54132 }
            
54213 }
            
54231 },
            
54312 }
            
{54321 } 
    }
;

    
public void printKey()
    
{
        
for (int i = 0; i < 5; i++)
        
{
            print(
"nationality", key[0][i]);
        }


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

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

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

        System.out.println();
        
for (int i = 0; i < 5; i++)
        
{
            print(
"tobacco", key[4][i]);
        }

        System.out.println();
    }


    
/**
     * 
     * 
@param item
     * 
@param index
     
*/

    
private void print(String item, int index)
    
{
        
if (false)
        
{
        }

        
else if ("nationality".equals(item))
        
{
            
switch (index)
            
{
            
case 1:
                System.out.print(
"英国人 ");
                
break;
            
case 2:
                System.out.print(
"瑞典人 ");
                
break;
            
case 3:
                System.out.print(
"丹麦人 ");
                
break;
            
case 4:
                System.out.print(
"挪威人 ");
                
break;
            
case 5:
                System.out.print(
"德国人 ");
                
break;
            }

        }

        
else if ("color".equals(item))
        
{
            
switch (index)
            
{
            
case 1:
                System.out.print(
"红房子 ");
                
break;
            
case 2:
                System.out.print(
"绿房子 ");
                
break;
            
case 3:
                System.out.print(
"黄房子 ");
                
break;
            
case 4:
                System.out.print(
"白房子 ");
                
break;
            
case 5:
                System.out.print(
"蓝房子 ");
                
break;
            }

        }

        
else if ("pet".equals(item))
        
{
            
switch (index)
            
{
            
case 1:
                System.out.print(
"");
                
break;
            
case 2:
                System.out.print(
"");
                
break;
            
case 3:
                System.out.print(
"");
                
break;
            
case 4:
                System.out.print(
"");
                
break;
            
case 5:
                System.out.print(
"");
                
break;
            }

        }

        
else if ("drink".equals(item))
        
{
            
switch (index)
            
{
            
case 1:
                System.out.print(
"");
                
break;
            
case 2:
                System.out.print(
"咖啡 ");
                
break;
            
case 3:
                System.out.print(
"牛奶 ");
                
break;
            
case 4:
                System.out.print(
"啤酒 ");
                
break;
            
case 5:
                System.out.print(
"");
                
break;
            }

        }

        
else if ("tobacco".equals(item))
        
{
            
switch (index)
            
{
            
case 1:
                System.out.print(
"PALLMALL ");
                
break;
            
case 2:
                System.out.print(
"DUNHILL ");
                
break;
            
case 3:
                System.out.print(
"BLUEMASTER ");
                
break;
            
case 4:
                System.out.print(
"PRINCE ");
                
break;
            
case 5:
                System.out.print(
"混合烟 ");
                
break;
            }

        }

    }


    
//        条件1:英国人住在红房子里  01        
    private boolean check01()
    
{
        
for (int i = 0; i < nationalities.length; i++)
        
{
            
if (key[0][i] == NATIONALITY_ENGLISH)
            
{
                
if (key[1][i] != COLOR_RED)
                
{
                    
return false;
                }

                
else
                
{
                    
return true;
                }

            }

        }

        
return false;
    }


    
//        条件2:瑞典人养了一条狗  02        
    private boolean check02()
    
{
        
for (int i = 0; i < nationalities.length; i++)
        
{
            
if (key[0][i] == NATIONALITY_SWIDISH)
            
{
                
if (key[2][i] != PET_DOG)
                
{
                    
return false;
                }

                
else
                
{
                    
return true;
                }

            }

        }

        
return false;
    }


    
//        条件4:绿房子在白房子的左边  1        
    private boolean check1()
    
{
        
for (int i = 0; i < colors.length; i++)
        
{
            
if (key[1][i] == COLOR_GREEN)
            
{
                
for (int j = 0; j < colors.length; j++)
                
{
                    
if (key[1][j] == COLOR_WHITE)
                    
{
                        
if (i > j)
                        
{
                            
return false;
                        }

                        
else
                        
{
                            
return true;
                        }

                    }

                }

            }

        }

        
return false;
    }


    
//        条件8:住在中间房子的人喝牛奶  3                
    private boolean check3()
    
{
        
return key[3][2== DRINK_MILK ? true : false;
    }


    
//        条件9:挪威人住在第一间房子  0        
    private boolean check0()
    
{
        
if (key[0][0!= NATIONALITY_NORWAY)
        
{
            
return false;
        }

        
return true;
    }


    
//        14.挪威人住在蓝房子旁边  01        
    private boolean check011()
    
{
        
for (int i = 0; i < nationalities.length; i++)
        
{
            
if (key[0][i] == NATIONALITY_NORWAY)
            
{
                
for (int j = 0; j < colors.length; j++)
                
{
                    
if (key[1][j] == COLOR_BLUE)
                    
{
                        
if (Math.abs(i - j) == 1)
                        
{
                            
return true;
                        }

                        
else
                        
{
                            
return false;
                        }

                    }

                }

            }

        }

        
return false;
    }


    
///                
    
//条件1,2,3,4,8,9,14被拿出来提前检测(预检测以去除不必要的操作,减少执行时间)        
    private boolean check()
    
{
        
//                条件3:丹麦人喝茶  03                
        for (int i = 0; i < nationalities.length; i++)
        
{
            
if (key[0][i] == NATIONALITY_DAMARK)
            
{
                
if (key[3][i] != DRINK_TEA)
                
{
                    
return false;
                }

                
else
                
{
                    
break;
                }

            }

        }

        
//                条件5:绿房子主人喝咖啡  13                
        for (int i = 0; i < colors.length; i++)
        
{
            
if (key[1][i] == COLOR_GREEN)
            
{
                
if (key[3][i] != DRINK_COFFEE)
                
{
                    
return false;
                }

                
else
                
{
                    
break;
                }

            }

        }

        
//                条件6:抽pallmall烟的人养了一只鸟  24                
        for (int i = 0; i < tobaccoes.length; i++)
        
{
            
if (key[4][i] == TOBACCO_PALLMALL)
            
{
                
if (key[2][i] != PET_BIRD)
                
{
                    
return false;
                }

                
else
                
{
                    
break;
                }

            }

        }

        
//                条件7:黄房子主人抽dunhill烟  14                
        for (int i = 0; i < colors.length; i++)
        
{
            
if (key[1][i] == COLOR_YELLOW)
            
{
                
if (key[4][i] != TOBACCO_DUNHILL)
                
{
                    
return false;
                }

                
else
                
{
                    
break;
                }

            }

        }

        
//                条件10:抽混合烟的人住在养猫人的旁边  24                
        for (int i = 0; i < tobaccoes.length; i++)
        
{
            
if (key[4][i] == TOBACCO_MIXED)
            
{
                
for (int j = 0; j < pets.length; j++)
                
{
                    
if (key[2][j] == PET_CAT)
                    
{
                        
if (i - j != 1 && i - j != -1)
                        
{
                            
return false;
                        }

                        
break;
                    }

                }

                
break;
            }

        }

        
//                条件11:养马人住在抽dunhill烟人的旁边  24                
        for (int i = 0; i < pets.length; i++)
        
{
            
if (key[2][i] == PET_HORSE)
            
{
                
for (int j = 0; j < tobaccoes.length; j++)
                
{
                    
if (key[4][j] == TOBACCO_DUNHILL)
                    
{
                        
if (i - j != 1 && i - j != -1)
                        
{
                            
return false;
                        }

                        
break;
                    }

                }

                
break;
            }

        }

        
//                条件12:抽bluemaster烟的人喝啤酒  34                
        for (int i = 0; i < tobaccoes.length; i++)
        
{
            
if (key[4][i] == TOBACCO_BLUEMASTER)
            
{
                
if (key[3][i] != DRINK_BEER)
                
{
                    
return false;
                }

                
else
                
{
                    
break;
                }

            }

        }

        
//                13.德国人抽prince烟  04                
        for (int i = 0; i < nationalities.length; i++)
        
{
            
if (key[0][i] == NATIONALITY_GERMAN)
            
{
                
if (key[4][i] != TOBACCO_PRINCE)
                
{
                    
return false;
                }

                
else
                
{
                    
break;
                }

            }

        }

        
//                15.抽混合烟的人的邻居喝矿泉水  34                
        for (int i = 0; i < tobaccoes.length; i++)
        
{
            
if (key[4][i] == TOBACCO_MIXED)
            
{
                
for (int j = 0; j < drinks.length; j++)
                
{
                    
if (key[3][j] == DRINK_WATER)
                    
{
                        
if ((i - j != 1&& (i - j != -1))
                        
{
                            
return false;
                        }

                        
else
                        
{
                            
break;
                        }

                    }

                }

                
break;
            }

        }

        
//满足所有条件:                
        return true;
    }


    
/**
     * 
     *
     
*/

    
public void run()
    
{
        
int count = 0;
        
for (int a = 0; a < 120; a++)
        
{
            
for (int i = 0; i < 5; i++)
            
{
                key[
0][i] = values[a][i];
            }

            
if (!check0())
            
{
                
continue;
            }

            
for (int b = 0; b < 120; b++)
            
{
                
for (int i = 0; i < 5; i++)
                
{
                    key[
1][i] = values[b][i];
                }

                
if (!check01() || !check011() || !check1())
                
{
                    
continue;
                }

                
for (int c = 0; c < 120; c++)
                
{
                    
for (int i = 0; i < 5; i++)
                    
{
                        key[
2][i] = values[c][i];
                    }

                    
if (!check02())
                    
{
                        
continue;
                    }

                    
for (int d = 0; d < 120; d++)
                    
{
                        
for (int i = 0; i < 5; i++)
                        
{
                            key[
3][i] = values[d][i];
                        }

                        
if (!check3())
                        
{
                            
continue;
                        }

                        
for (int e = 0; e < 120; e++)
                        
{
                            
for (int i = 0; i < 5; i++)
                            
{
                                key[
4][i] = values[e][i];
                            }

                            
if (!check())
                            
{
                                
continue;
                            }

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

                    }

                }

            }

        }

    }


    
/**
     * 
     * 
@param args
     
*/

    
public static void main(String[] args)
    
{
        WhoFeedsFish wff 
= new WhoFeedsFish();
        System.out.println(wff.getProblem());
        System.out.println(
"========================================Start========================================");
        wff.run();
        System.out.println(
"========================================End==========================================");
    }

}




 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值