楼主: soachina

如何用算法来解决爱因斯坦在20世纪初出的这个谜语

[复制链接]
论坛徽章:
4
生肖徽章:牛
日期:2007-05-07 05:31:44ERP板块每日发贴之星
日期:2007-05-21 01:02:55设计板块每日发贴之星
日期:2007-05-23 01:04:28会员2007贡献徽章
日期:2007-09-26 18:42:10
11#
发表于 2007-5-22 13:37 | 只看该作者
经典

使用道具 举报

回复
论坛徽章:
10
授权会员
日期:2007-08-09 15:37:26会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB元老
日期:2007-10-15 21:12:09ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28灰彻蛋
日期:2013-06-24 14:20:02
12#
发表于 2007-5-29 16:46 | 只看该作者
如果能写出这个算法来,那就是真正的人工智能了!!!!!!!!!!!!

使用道具 举报

回复
论坛徽章:
8
六级虎吧徽章
日期:2009-04-03 13:56:21
13#
发表于 2007-5-29 23:44 | 只看该作者
解决了没有啊?

使用道具 举报

回复
论坛徽章:
8
六级虎吧徽章
日期:2009-04-03 13:56:21
14#
发表于 2007-5-29 23:44 | 只看该作者
最初由 catchwo 发布
[B]如果能写出这个算法来,那就是真正的人工智能了!!!!!!!!!!!! [/B]


94

使用道具 举报

回复
论坛徽章:
0
15#
发表于 2007-6-17 20:53 | 只看该作者
最初由 lawer-bbc 发布
[B]

讲讲 [/B]


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

使用道具 举报

回复
论坛徽章:
91
咸鸭蛋
日期:2012-12-24 21:01:27奥运会纪念徽章:手球
日期:2012-10-28 11:32:12奥运会纪念徽章:足球
日期:2012-10-27 09:41:27ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15奥运会纪念徽章:跆拳道
日期:2012-06-22 11:53:52灰彻蛋
日期:2012-02-16 16:21:102012新春纪念徽章
日期:2012-01-04 11:53:29紫水晶
日期:2012-08-22 15:08:48ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26ITPUB十周年纪念徽章
日期:2011-09-27 16:32:49
16#
发表于 2007-6-17 22:32 | 只看该作者
我以前思考过这个问题。但是没有考虑算法问题。

使用道具 举报

回复
论坛徽章:
94
会员2007贡献徽章
日期:2007-09-26 18:42:102013年新春福章
日期:2013-02-25 14:51:24鲜花蛋
日期:2013-01-17 10:14:19ITPUB 11周年纪念徽章
日期:2012-10-09 18:06:20蛋疼蛋
日期:2011-11-09 14:19:52蛋疼蛋
日期:2011-08-11 09:31:52蛋疼蛋
日期:2011-08-08 11:05:52双黄蛋
日期:2011-07-06 15:15:11蛋疼蛋
日期:2011-06-29 13:02:442010广州亚运会纪念徽章:帆船
日期:2011-03-29 14:26:18
17#
发表于 2007-6-21 13:37 | 只看该作者
用矩阵,这个答案早就出啦

使用道具 举报

回复
zn519 该用户已被删除
18#
发表于 2008-3-28 17:00 | 只看该作者
同事无聊,信手拈来,几分钟思考后,写了段代码并输出了结果。以下是部分代码内容,俺没看懂的说

据说这一段是核心算法:

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());
                                cList.add(Country.values());
                                pList.add(Pet.values());
                                dList.add(Drink.values());
                                sList.add(Smoke.values());
                        }
                        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]



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

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

使用道具 举报

回复
zn519 该用户已被删除
19#
发表于 2008-3-28 17:10 | 只看该作者
另外分别定义了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
}

使用道具 举报

回复
zn519 该用户已被删除
20#
发表于 2008-3-28 17:11 | 只看该作者
还有一同事,按照咨询师的思维逻辑,手工弄出来了,佩服。
见附件。

doc3.doc

31.5 KB, 下载次数: 35

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表