ITPUB论坛 » 算法讨论与研究 » 如何用算法来解决爱因斯坦在20世纪初出的这个谜语
新一届的微软MVP评选已经开始,欢迎各位推荐!
2007-3-14 11:21 soachina
如何用算法来解决爱因斯坦在20世纪初出的这个谜语

爱因斯坦在20世纪初出的这个谜语。他说世界上有98%的人答不出来。某家公司在面试应聘者时借用了爱因斯坦的这个IQ题,考查应聘者的IQ,现在我们暂且不去讨论这个公司用这样的题目来考查应聘者的IQ有多“变态”,如果是你,拿到了这样的笔试题目,你能做得出来吗?

  1、在一条街上,有5座房子,喷了5种颜色。

  2、每个房里住着不同国籍的人

  3、每个人喝不同的饮料,抽不同品牌的香烟,养不同的宠物

  问题是:谁养鱼?

  提示:

  1、英国人住红色房子

  2、瑞典人养狗

  3、丹麦人喝茶

  4、绿色房子在白色房子左面

  5、绿色房子主人喝咖啡

  6、抽Pall Mall 香烟的人养鸟

  7、黄色房子主人抽Dunhill 香烟

  8、住在中间房子的人喝牛奶

  9、 挪威人住第一间房

  10、抽Blends香烟的人住在养猫的人隔壁

  11、养马的人住抽Dunhill 香烟的人隔壁

  12、抽Blue Master的人喝啤酒

  13、德国人抽Prince香烟

  14、挪威人住蓝色房子隔壁

  15、抽Blends香烟的人有一个喝水的邻居

  以上是爱因斯坦在20世纪初出的这个谜语。他说世界上有98%的人答不出来。

2007-3-25 22:53 tang2007
有些复杂啊

2007-3-25 22:54 tang2007
不过应该还是有办法解决的

2007-4-6 13:58 dy_david
德国

2007-4-7 23:57 tang2007
不会只有答案吧:)过程呢?

2007-4-10 22:57 lawer-bbc
关注下

2007-4-24 23:30 sting_gxj
有意思啊

2007-4-25 10:03 fixphy1985
找到关键点就很简单了,我初中就做过这道题了

2007-4-25 13:10 lawer-bbc
[QUOTE][i]最初由 fixphy1985 发布[/i]
[B]找到关键点就很简单了,我初中就做过这道题了 [/B][/QUOTE]

讲讲:rose:

2007-5-21 20:23 chinjecn
最近在学矩阵分析,用这来分析一下:
   1| 2| 3| 4| 5
颜色 黄| 篮| 红| 绿| 白
国际 挪威| 丹麦| 英国| 德国| 瑞典
饮料 水| 茶| 牛奶| 咖啡| 啤酒
香烟   Dunhill|      Blends| P   all Mall|   Prince|  Blue Master
宠物 猫| 马| 鸟| 鱼| 狗

2007-5-22 13:37 davis_zhou
经典

2007-5-29 16:46 catchwo
如果能写出这个算法来,那就是真正的人工智能了!!!!!!!!!!!!

2007-5-29 23:44 tang2007
解决了没有啊?:)

2007-5-29 23:44 tang2007
[QUOTE][i]最初由 catchwo 发布[/i]
[B]如果能写出这个算法来,那就是真正的人工智能了!!!!!!!!!!!! [/B][/QUOTE]

:right: 94:)

2007-6-17 20:53 sibling
[QUOTE][i]最初由 lawer-bbc 发布[/i]
[B]

讲讲:rose: [/B][/QUOTE]

把5个属性每个的五种可能列出来(便于察看),再开始从左到右12345列成5*5的方阵,根据规则来填,把条件多梳理几遍,一步一步前进即可

2007-6-17 22:32 122408644
我以前思考过这个问题。但是没有考虑算法问题。

2007-6-21 13:37 dinner1007
用矩阵,这个答案早就出啦

2008-3-28 17:00 zn519
同事无聊,信手拈来,几分钟思考后,写了段代码并输出了结果。以下是部分代码内容,俺没看懂的说

据说这一段是核心算法:

public class Einstein{

        public static void main(String[] args) {
                List<Object> hl = new LinkedList<Object>();
                for (int i = 0; i < 5; i++) {
                        hl.add(i);
                }
                List<List<Object>> random = DFC(hl);
                List<List<House>> houseList = new LinkedList<List<House>>();
                List<List<Country>> countryList = new LinkedList<List<Country>>();
                List<List<Pet>> petList = new LinkedList<List<Pet>>();
                List<List<Drink>> drinkList = new LinkedList<List<Drink>>();
                List<List<Smoke>> smokeList = new LinkedList<List<Smoke>>();
                for (List<Object> o : random) {
                        List<House> hList = new LinkedList<House>();
                        List<Country> cList = new LinkedList<Country>();
                        List<Pet> pList = new LinkedList<Pet>();
                        List<Drink> dList = new LinkedList<Drink>();
                        List<Smoke> sList = new LinkedList<Smoke>();
                        for (Object oo : o) {
                                int i = (Integer) oo;
                                hList.add(House.values()[i]);
                                cList.add(Country.values()[i]);
                                pList.add(Pet.values()[i]);
                                dList.add(Drink.values()[i]);
                                sList.add(Smoke.values()[i]);
                        }
                        houseList.add(hList);
                        countryList.add(cList);
                        petList.add(pList);
                        drinkList.add(dList);
                        smokeList.add(sList);
                }
                // 第一趟,循环国家
                for (List<Country> c : countryList) {
                        // 9、挪威人住第一间房
                        if (c.get(0) != Country.norway)
                                continue;
                        // 第二趟,循环房子
                        for (List<House> h : houseList) {
                                // 1、英国人住红房子
                                if (c.indexOf(Country.english) != h.indexOf(House.red))
                                        continue;
                                // 4、绿房子在白房子左边
                                if (h.indexOf(House.white) - h.indexOf(House.green) != 1)
                                        continue;
                                // 14、挪威人住蓝色房子隔壁
                                int p14 = c.indexOf(Country.norway) - h.indexOf(House.blue);
                                if (p14 != 1 && p14 != -1)
                                        continue;
                                // 第三趟,循环饮料
                                for (List<Drink> d : drinkList) {
                                        // 3、丹麦人喝茶
                                        if (d.indexOf(Drink.tea) != c.indexOf(Country.danmark))
                                                continue;
                                        // 5、绿色房子喝咖啡
                                        if (d.indexOf(Drink.coffee) != h.indexOf(House.green))
                                                continue;
                                        // 8、中间房子喝牛奶
                                        if (d.indexOf(Drink.milk) != 2)
                                                continue;
                                        // 第四趟,循环烟
                                        for (List<Smoke> s : smokeList) {
                                                // 7、黄色房子主人抽Dunhill 香烟
                                                if (h.indexOf(House.yellow) != s.indexOf(Smoke.D))
                                                        continue;
                                                // 12、抽Blue Master的人喝啤酒
                                                if (d.indexOf(Drink.beer) != s.indexOf(Smoke.BM))
                                                        continue;
                                                // 13、德国人抽Prince香烟
                                                if (c.indexOf(Country.germen) != s.indexOf(Smoke.P))
                                                        continue;
                                                // 15、抽Blends香烟的人有一个喝水的邻居
                                                int p15 = d.indexOf(Drink.water) - s.indexOf(Smoke.B);
                                                if (p15 != 1 && p15 != -1)
                                                        continue;
                                                // 第五趟,循环宠物
                                                for (List<Pet> p : petList) {
                                                        // 2、瑞典人养狗
                                                        if (p.indexOf(Pet.dog) != c.indexOf(Country.sweeden))
                                                                continue;
                                                        // 6、抽Pall Mall 香烟的人养鸟
                                                        if (p.indexOf(Pet.bird) != s.indexOf(Smoke.PM))
                                                                continue;
                                                        // 10、抽Blends香烟的人住在养猫的人隔壁
                                                        int p10 = p.indexOf(Pet.cat) - s.indexOf(Smoke.B);
                                                        if (p10 != 1 && p10 != -1)
                                                                continue;
                                                        // 11、养马的人住抽Dunhill 香烟的人隔壁
                                                        int p11 = p.indexOf(Pet.horse) - s.indexOf(Smoke.D);
                                                        if (p11 != 1 && p11 != -1)
                                                                continue;
                                                        System.out.println("答案:");
                                                        System.out.println("房间顺序:"+h);
                                                        System.out.println("国家顺序:"+c);
                                                        System.out.println("饮料顺序:"+d);
                                                        System.out.println("香烟顺序:"+s);
                                                        System.out.println("宠物顺序:"+p);
                                                }
                                        }
                                }
                        }
                }

        }

        public static List<List<Object>> DFC(List<Object> values) {
                List<List<Object>> result = new LinkedList<List<Object>>();
                if (values.size() == 1) {
                        List<Object> r = new LinkedList<Object>();
                        r.add(values.get(0));
                        result.add(r);
                } else {
                        for (int i = 0; i < values.size(); i++) {
                                List<Object> t = new LinkedList<Object>(values);
                                t.remove(i);
                                List<List<Object>> tr = DFC(t);
                                for (List<Object> temp : tr) {
                                        List<Object> r = new LinkedList<Object>();
                                        r.add(values.get(i));
                                        r.addAll(temp);
                                        result.add(r);
                                }
                        }
                }
                return result;
        }

}





答案:
房间顺序:[yellow, blue, red, green, white]
国家顺序:[norway, danmark, english, germen, sweeden]
饮料顺序:[water, tea, milk, coffee, beer]
香烟顺序:[D, B, PM, P, BM]
宠物顺序:[cat, horse, bird, fish, dog]



代码不全,但核心算法已经有了,凑合着看吧

[[i] 本帖最后由 zn519 于 2008-3-28 17:07 编辑 [/i]]

2008-3-28 17:10 zn519
另外分别定义了5种事物

Country.java

public enum Country {
        english,sweeden,danmark,germen,norway
}


Drink.java

public enum Drink {
        tea,coffee,beer,milk,water
}

House.java

public enum House {

        red,blue,green,white,yellow
}

Pet.java

public enum Pet {
        bird,fish,cat,dog,horse
}

Smoke.java

public enum Smoke {
        B,BM,P,D,PM
}

2008-3-28 17:11 zn519
还有一同事,按照咨询师的思维逻辑,手工弄出来了,佩服。
见附件。

页: [1] 2


Powered by ITPUB论坛