论坛首页 Java企业应用论坛

一道应聘智力题的编程求解

浏览 23372 次
精华帖 (0) :: 良好帖 (9) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-03-05  
楼上朋友的解法相当于给出了解决该类问题的一个标准思路,相当不错,赞一个,如果能有Java版的就更好了。楼上另外几位朋友也提供了一些工具和思路,如果有时间的话也非常值得深入研究下去,在这里我就相当于起到了一个抛砖引玉的作用,哈哈。
0 请登录后投票
   发表时间:2010-03-06   最后修改:2010-03-06
gaoqs1984 写道
离散数学里讲过这样的,是太多判断了,以前是这个解的好像
A->B
C->!D
B->!C

==>B->D

A推理出B,C推理出,不是D
B推出不是C

那么B推出C


条件都说了B->!C,却说结果是B推出C
0 请登录后投票
   发表时间:2010-03-06   最后修改:2010-03-06

演示一下我的逻辑推理步骤:

1. 梳理出题中出现的各种值(按出现的先后次序)

房子颜色
红色
绿色
白色
黄色
蓝色
国籍
英国
瑞典
丹麦
挪威
德国
养的宠物





喝的饮料

咖啡
牛奶
啤酒
矿泉水
香烟品牌
Pall Mall
Dunhill
Blue Master
Prince
混合烟

2. 整理条件,将一一对应的条件(非常明确的条件)与其他条件区分开来

1、英国人 --> 红房子
2、瑞典人 --> 狗
3、丹麦人 --> 茶
5、绿房子 --> 咖啡
6、Pall Mall --> 鸟
7、黄房子 --> Dunhill
12、Blue Master --> 啤酒
13、德国人 --> Prince
4、绿房子在白房子左边
8、住在中间那间房子的人喝牛奶
9、挪威人住第一间房子
10、抽混合烟的人住在养猫人的旁边
11、养马人住在抽Dunhill烟的人旁边
14、挪威人住在蓝房子旁边
15、抽混合烟的人的邻居喝矿泉水

3. 定位房子的排序

根据9、14、8、4、5,得出:2号房为蓝色,4号房为绿色,5号房为白色
9、挪威人住第一间房子
14、挪威人住在蓝房子旁边
8、住在中间那间房子的人喝牛奶
4、绿房子在白房子左边
5、绿房子 --> 咖啡

1、英国人 --> 红房子

房子颜色
黄色
蓝色
红色
绿色
白色
国籍
挪威

英国


养的宠物





喝的饮料


牛奶
咖啡

香烟品牌





好了,有了上面的表,我们再也用不着上面5个条件了,我们把他们删掉,以免混淆视听。下面是整理后的条件列表:
2、瑞典人 --> 狗
3、丹麦人 --> 茶
6、Pall Mall --> 鸟
7、黄房子 --> Dunhill
12、Blue Master --> 啤酒
13、德国人 --> Prince
10、抽混合烟的人住在养猫人的旁边
11、养马人住在抽Dunhill烟的人旁边
15、抽混合烟的人的邻居喝矿泉水

4. 接下来,我们将很显而易见的两个条件(7、11)也整理到表中

7、黄房子 --> Dunhill
11、养马人住在抽Dunhill烟的人旁边

房子颜色
黄色
蓝色
红色
绿色
白色
国籍
挪威

英国


养的宠物





喝的饮料


牛奶
咖啡

香烟品牌
Dunhill




那么,剩下的条件就是这些了:
2、瑞典人 --> 狗

3、丹麦人 --> 茶
6、Pall Mall --> 鸟
12、Blue Master --> 啤酒
13、德国人 --> Prince
10、抽混合烟的人住在养猫人的旁边
15、抽混合烟的人的邻居喝矿泉水

5. 忘了宠物吧,我们从国籍、饮料、香烟这些条件中继续推理

3、丹麦人 --> 茶
12、Blue Master --> 啤酒
13、德国人 --> Prince
15、抽混合烟的人的邻居喝矿泉水
根据条件3,丹麦人可能在蓝房子或白房子里;
根据条件12,喝啤酒的人可能在蓝房子或白房子里;
很显然,丹麦人和喝啤酒的人是两个人,那么这两个人会占据蓝房子和白房子;
同时喝啤酒的人不是德国人,因为他们抽不同的香烟。
所以,德国人住进了绿房子。

房子颜色
黄色
蓝色
红色
绿色
白色
国籍
挪威

英国
德国

养的宠物





喝的饮料


牛奶
咖啡

香烟品牌
Dunhill


Prince

这时,我们还剩下3个条件:
3、丹麦人 --> 茶
12、Blue Master --> 啤酒
15、抽混合烟的人的邻居喝矿泉水
根据15推断,抽混合烟的人不可能住白色房子;
假设抽混合烟的人住红色房子,那么根据15住蓝色房子的人就喝矿泉水,根据3丹麦人不住蓝色房子而住白色房子,那么条件12就永远都不成立。
所以,抽混合烟的人住蓝色房子:

房子颜色
黄色
蓝色
红色
绿色
白色
国籍
挪威

英国
德国

养的宠物





喝的饮料
矿泉水

牛奶
咖啡

香烟品牌
Dunhill
混合烟

Prince

剩下的两个条件我们就很容易填充到表中了,条件12中描述的人肯定住白色房子,而丹麦人就只有住蓝色房子了。
3、丹麦人 --> 茶
12、Blue Master --> 啤酒

房子颜色
黄色
蓝色
红色
绿色
白色
国籍
挪威
丹麦人
英国
德国

养的宠物





喝的饮料
矿泉水

牛奶
咖啡
啤酒
香烟品牌
Dunhill
混合烟

Prince
Blue Master

接下来,我们把剩下的国籍和香烟品牌填充完毕:

房子颜色
黄色
蓝色
红色
绿色
白色
国籍
挪威
丹麦人
英国
德国
瑞典
养的宠物





喝的饮料
矿泉水

牛奶
咖啡
啤酒
香烟品牌
Dunhill
混合烟
Pall Mall
Prince
Blue Master

6. 由剩下的有关宠物的条件填充表格完毕

2、瑞典人 --> 狗
6、Pall Mall --> 鸟
10、抽混合烟的人住在养猫人的旁边

房子颜色
黄色
蓝色
红色
绿色
白色
国籍
挪威
丹麦人
英国
德国
瑞典
养的宠物





喝的饮料
矿泉水

牛奶
咖啡
啤酒
香烟品牌
Dunhill
混合烟
Pall Mall
Prince
Blue Master

7. 所以,最后的结论是:德国人养鱼

0 请登录后投票
   发表时间:2010-03-07  
ls你很擅长写文档啊
0 请登录后投票
   发表时间:2010-03-08   最后修改:2010-03-08
iaimstar 写道
ls你很擅长写文档啊

呵呵,谢谢;)
文章的排版是Google Document的功劳;文章的组织是在公司写案例锻炼出来的;)
0 请登录后投票
   发表时间:2010-03-09  
I like these tables, these are the states of logical steps.

My solution is here:
http://jellyfish.iteye.com/admin/blogs/610841
0 请登录后投票
   发表时间:2010-03-11  
用Choco这个库写了个解法,jar包放在附件里了,

import choco.integer.IntDomainVar;
import choco.Problem;

public class Puzzle {

/**
* @param args
*/
public static void main(String[] args) {

          System.out.println("Problem of puzzle logic :");
   
    //create a problem
    Problem pb = new Problem();
   
    //create variable
    IntDomainVar[]  nation = new IntDomainVar[5];
    IntDomainVar[]  color = new IntDomainVar[5];
    IntDomainVar[]  drink = new IntDomainVar[5];
    IntDomainVar[]  pet = new IntDomainVar[5];
    IntDomainVar[]  tabaco = new IntDomainVar[5];
   
             //定义每个变量的范围是0到4,表示第一到第五个房子
    nation[0] = pb.makeEnumIntVar("Norwegian",0,4);
    nation[1] = pb.makeEnumIntVar("Danish",0,4);
    nation[2] = pb.makeEnumIntVar("Swede",0,4);
    nation[3] = pb.makeEnumIntVar("British",0,4);
    nation[4] = pb.makeEnumIntVar("Germen",0,4);
    color[0] = pb.makeEnumIntVar("red",0,4);
    color[1] = pb.makeEnumIntVar("yellow",0,4);
    color[2] = pb.makeEnumIntVar("green",0,4);
    color[3] = pb.makeEnumIntVar("white",0,4);
    color[4] = pb.makeEnumIntVar("blue",0,4);
    drink[0] = pb.makeEnumIntVar("water",0,4);
    drink[1] = pb.makeEnumIntVar("tea",0,4);
    drink[2] = pb.makeEnumIntVar("coffee",0,4);
    drink[3] = pb.makeEnumIntVar("beer",0,4);
    drink[4] = pb.makeEnumIntVar("milk",0,4);
    pet[0] = pb.makeEnumIntVar("dog",0,4);
    pet[1] = pb.makeEnumIntVar("cat",0,4);
    pet[2] = pb.makeEnumIntVar("horse",0,4);
    pet[3] = pb.makeEnumIntVar("fish",0,4);
    pet[4] = pb.makeEnumIntVar("bird",0,4);
    tabaco[0] = pb.makeEnumIntVar("dunhill",0,4);
    tabaco[1] = pb.makeEnumIntVar("mix",0,4);
    tabaco[2] = pb.makeEnumIntVar("pallmall",0,4);
    tabaco[3] = pb.makeEnumIntVar("prince",0,4);
    tabaco[4] = pb.makeEnumIntVar("bluemaster",0,4);
   
    //Globe Constraints,每一类的变量值不重复
    pb.post(pb.allDifferent(nation));
    pb.post(pb.allDifferent(color));
    pb.post(pb.allDifferent(drink));
    pb.post(pb.allDifferent(pet));
    pb.post(pb.allDifferent(tabaco));
   
    //Constraints 一般的约束条件
    pb.post(pb.eq(nation[3],color[0]));
    pb.post(pb.eq(nation[2],pet[0]));
    pb.post(pb.eq(nation[1],drink[1]));
    pb.post(pb.eq(pb.plus(color[2],1),color[3]));
    pb.post(pb.eq(color[2],drink[2]));
    pb.post(pb.eq(tabaco[2],pet[4]));
    pb.post(pb.eq(tabaco[0],color[1]));
    pb.post(pb.eq(2,drink[4]));
    pb.post(pb.eq(nation[3],0));
    pb.post(pb.or(pb.eq(tabaco[1], pb.plus(pet[1],1)),pb.eq(tabaco[1], pb.minus(pet[1],1))));
    pb.post(pb.or(pb.eq(pet[2], pb.plus(tabaco[0],1)),pb.eq(pet[2], pb.minus(tabaco[0],1))));
    pb.post(pb.eq(tabaco[4],drink[3]));
    pb.post(pb.eq(nation[4],tabaco[3]));
    pb.post(pb.or(pb.eq(nation[0], pb.plus(color[4],1)),pb.eq(nation[0], pb.minus(color[4],1))));
    pb.post(pb.or(pb.eq(tabaco[1], pb.plus(drink[0],1)),pb.eq(tabaco[1], pb.minus(drink[0],1))));
   
    //Search the solution
    pb.solve();
   
    //Display the solution
    for (int i =0; i < 5; i++) {
    if(pet[3].getVal() == nation[i].getVal()) {
    System.out.println("It's "+ nation[i]);
    }
    }
   
}

}
0 请登录后投票
   发表时间:2010-03-11  
为啥是40^6呢?
0 请登录后投票
   发表时间:2010-03-11  
楼主 逻辑 和 耐心 真强
0 请登录后投票
   发表时间:2010-03-24   最后修改:2010-03-24
搜索空间有问题吧,应该不是40^6
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics