锁定老帖子 主题:一道应聘智力题的编程求解
精华帖 (0) :: 良好帖 (9) :: 新手帖 (0) :: 隐藏帖 (0)
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
作者 | 正文 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2010-03-05
楼上朋友的解法相当于给出了解决该类问题的一个标准思路,相当不错,赞一个,如果能有Java版的就更好了。楼上另外几位朋友也提供了一些工具和思路,如果有时间的话也非常值得深入研究下去,在这里我就相当于起到了一个抛砖引玉的作用,哈哈。
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间: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 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2010-03-06
最后修改:2010-03-06
演示一下我的逻辑推理步骤:
|
房子颜色 |
红色 |
绿色 |
白色 |
黄色 |
蓝色 |
国籍 |
英国 |
瑞典 |
丹麦 |
挪威 |
德国 |
养的宠物 |
狗 |
鸟 |
猫 |
马 |
鱼 |
喝的饮料 |
茶 |
咖啡 |
牛奶 |
啤酒 |
矿泉水 |
香烟品牌 |
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. 所以,最后的结论是:德国人养鱼
呵呵,谢谢;)
文章的排版是Google Document的功劳;文章的组织是在公司写案例锻炼出来的;)
My solution is here:
http://jellyfish.iteye.com/admin/blogs/610841
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]);
}
}
}
}