网上看到一个关于爱因斯坦的推断题,稍微做了下,但是总感觉答案不止一个。google了一下,果然如此,有些人说是丹麦的有些说是德国的。
为了达到最完美的结论,我决定用最原始的方法–穷举法做出来,我会编程我怕谁。。。
用了20分钟写了个java程序,大多数时间是在复制粘贴,来展示下部分代码吧。(Enum类型和bean就不写出来了)
格式就不整理了,放在eclipse里面format一下吧。
果然,答案不止丹麦和德国,还有一种情况是挪威!所有的排雷组合,3种德国,3种丹麦,1种挪威。
所以说这道题是个多选答案。我才是那2%的人,哈哈哈哈。
运行结果:(有些题目里的香烟牌子有所不同,反正不影响最终答案)
Green,Norway,Coffee,Bird,PALLMALL
Blue,Germany,Water,Fish,PRINCE
Red,England,Milk,Horse,MIX
Yellow,Danmark,Tea,Cat,DUNHILL
White,Sweden,Beer,Dog,BLUEMASTER
=========================
Green,Norway,Coffee,Bird,PALLMALL
Blue,Germany,Water,Cat,PRINCE
Red,England,Milk,Horse,MIX
Yellow,Danmark,Tea,Fish,DUNHILL
White,Sweden,Beer,Dog,BLUEMASTER
=========================
Green,Norway,Coffee,Bird,PALLMALL
Blue,Germany,Water,Cat,PRINCE
White,Sweden,Milk,Dog,MIX
Red,England,Beer,Horse,BLUEMASTER
Yellow,Danmark,Tea,Fish,DUNHILL
=========================
Green,Norway,Coffee,Bird,PALLMALL
Blue,Germany,Water,Fish,PRINCE
White,Sweden,Milk,Dog,MIX
Yellow,Danmark,Tea,Cat,DUNHILL
Red,England,Beer,Horse,BLUEMASTER
=========================
Green,Norway,Coffee,Bird,PALLMALL
Blue,Germany,Water,Cat,PRINCE
White,Sweden,Milk,Dog,MIX
Yellow,Danmark,Tea,Fish,DUNHILL
Red,England,Beer,Horse,BLUEMASTER
=========================
Green,Norway,Coffee,Fish,MIX
Blue,Germany,Water,Cat,PRINCE
Yellow,Sweden,Milk,Dog,DUNHILL
Red,England,Beer,Horse,BLUEMASTER
White,Danmark,Tea,Bird,PALLMALL
=========================
Yellow,Norway,Water,Cat,DUNHILL
Blue,Danmark,Tea,Horse,MIX
Red,England,Milk,Bird,PALLMALL
Green,Germany,Coffee,Fish,PRINCE
White,Sweden,Beer,Dog,BLUEMASTER
程序:(程序高手帮忙看下有没有bug,我懒得再看了,呵呵)
public class Main {
private int[][] map = {
{0,1,2,3,4}
,{0,1,2,4,3}
,{0,1,3,2,4}
,{0,1,3,4,2}
,{0,1,4,3,2}
,{0,1,4,2,3}
,{0,2,1,3,4}
,{0,2,1,4,3}
,{0,2,3,1,4}
,{0,2,3,4,1}
,{0,2,4,3,1}
,{0,2,4,1,3}
,{0,3,2,1,4}
,{0,3,2,4,1}
,{0,3,1,2,4}
,{0,3,1,4,2}
,{0,3,4,1,2}
,{0,3,4,2,1}
,{0,4,2,3,1}
,{0,4,2,1,3}
,{0,4,3,2,1}
,{0,4,3,1,2}
,{0,4,1,3,2}
,{0,4,1,2,3}
,{1,0,2,3,4}
,{1,0,2,4,3}
,{1,0,3,2,4}
,{1,0,3,4,2}
,{1,0,4,3,2}
,{1,0,4,2,3}
,{1,2,0,3,4}
,{1,2,0,4,3}
,{1,2,3,0,4}
,{1,2,3,4,0}
,{1,2,4,3,0}
,{1,2,4,0,3}
,{1,3,2,0,4}
,{1,3,2,4,0}
,{1,3,0,2,4}
,{1,3,0,4,2}
,{1,3,4,0,2}
,{1,3,4,2,0}
,{1,4,2,3,0}
,{1,4,2,0,3}
,{1,4,3,2,0}
,{1,4,3,0,2}
,{1,4,0,3,2}
,{1,4,0,2,3}
,{2,1,0,3,4}
,{2,1,0,4,3}
,{2,1,3,0,4}
,{2,1,3,4,0}
,{2,1,4,3,0}
,{2,1,4,0,3}
,{2,0,1,3,4}
,{2,0,1,4,3}
,{2,0,3,1,4}
,{2,0,3,4,1}
,{2,0,4,3,1}
,{2,0,4,1,3}
,{2,3,0,1,4}
,{2,3,0,4,1}
,{2,3,1,0,4}
,{2,3,1,4,0}
,{2,3,4,1,0}
,{2,3,4,0,1}
,{2,4,0,3,1}
,{2,4,0,1,3}
,{2,4,3,0,1}
,{2,4,3,1,0}
,{2,4,1,3,0}
,{2,4,1,0,3}
,{3,1,2,0,4}
,{3,1,2,4,0}
,{3,1,0,2,4}
,{3,1,0,4,2}
,{3,1,4,0,2}
,{3,1,4,2,0}
,{3,2,1,0,4}
,{3,2,1,4,0}
,{3,2,0,1,4}
,{3,2,0,4,1}
,{3,2,4,0,1}
,{3,2,4,1,0}
,{3,0,2,1,4}
,{3,0,2,4,1}
,{3,0,1,2,4}
,{3,0,1,4,2}
,{3,0,4,1,2}
,{3,0,4,2,1}
,{3,4,2,0,1}
,{3,4,2,1,0}
,{3,4,0,2,1}
,{3,4,0,1,2}
,{3,4,1,0,2}
,{3,4,1,2,0}
,{4,1,2,3,0}
,{4,1,2,0,3}
,{4,1,3,2,0}
,{4,1,3,0,2}
,{4,1,0,3,2}
,{4,1,0,2,3}
,{4,2,1,3,0}
,{4,2,1,0,3}
,{4,2,3,1,0}
,{4,2,3,0,1}
,{4,2,0,3,1}
,{4,2,0,1,3}
,{4,3,2,1,0}
,{4,3,2,0,1}
,{4,3,1,2,0}
,{4,3,1,0,2}
,{4,3,0,1,2}
,{4,3,0,2,1}
,{4,0,2,3,1}
,{4,0,2,1,3}
,{4,0,3,2,1}
,{4,0,3,1,2}
,{4,0,1,3,2}
,{4,0,1,2,3}
};
public void cal(){
Combine[] pos = new Combine[5];
for(int i=0;i<5;i++){
pos[i] = new Combine();
}
Color[] color = {
Color.Blue,
Color.Green,
Color.Red,
Color.White,
Color.Yellow};
Pet[] pet = {Pet.Dog,
Pet.Fish,
Pet.Horse,
Pet.Cat,
Pet.Bird};
Drink[] drink = {
Drink.Tea,
Drink.Beer,
Drink.Milk,
Drink.Water,
Drink.Coffee
};
Smoke[] smoke = {
Smoke.PALLMALL,
Smoke.DUNHILL,
Smoke.MIX,
Smoke.BLUEMASTER,
Smoke.PRINCE
};
Nation[] nation = {
Nation.England,
Nation.Germany,
Nation.Sweden,
Nation.Danmark,
Nation.Norway
};
for(int ci=0;ci<120;ci++){
int[] cm = map[ci];
for(int i=0;i<5;i++){
pos[i].setHourseColor(color[cm[i]]);
}
for(int pi=0;pi<120;pi++){
int[] pm = map[pi];
for(int i=0;i<5;i++){
pos[i].setPet(pet[pm[i]]);
}
for(int di=0;di<120;di++){
int[] dm = map[di];
for(int i=0;i<5;i++){
pos[i].setDrink(drink[dm[i]]);
}
for(int si=0;si<120;si++){
int[] sm = map[si];
for(int i=0;i<5;i++){
pos[i].setSmoke(smoke[sm[i]]);
}
for(int ni=0;ni<120;ni++){
int[] nm = map[ni];
for(int i=0;i<5;i++){
pos[i].setNation(nation[nm[i]]);
}
if(isVaild(pos))printCombine(pos);
}
}
}
}
}
}
public boolean isVaild(Combine[] pos){
//9.挪威人住在第一间
if(pos[0].getNation()!= Nation.Norway)return false;
//8.住中间的人喝牛奶
if(pos[2].getDrink()!= Drink.Milk)return false;
for(int i=0;i<5;i++){
Combine c = pos[i];
//1.英国人住在红房子
if(c.getNation()==Nation.England&&c.getHourseColor()!=Color.Red)return false;
//2.瑞典人养狗
if(c.getNation()==Nation.Sweden&&c.getPet()!=Pet.Dog)return false;
//3.丹麦人喝茶
if(c.getNation()==Nation.Danmark&&c.getDrink()!=Drink.Tea)return false;
//4.绿房子在白房子左边(这个之前阴了我下,我以为左边的意思是邻居呢。。)
if(c.getHourseColor()==Color.Green){
boolean hasWhite = false;
for(int j=i+1;j<5;j++){
if(pos[j].getHourseColor()==Color.White)hasWhite=true;
}
if(!hasWhite)return false;
}
//5.绿房子人喝咖啡
if(c.getHourseColor()==Color.Green&&c.getDrink()!=Drink.Coffee)return false;
//6.抽PALL MALL的人养鸟
if(c.getSmoke()==Smoke.PALLMALL&&c.getPet()!=Pet.Bird)return false;
//7.黄房子人抽DUNHILL
if(c.getHourseColor()==Color.Yellow&&c.getSmoke()!=Smoke.DUNHILL)return false;
//10.抽混合烟的人住在养猫人旁边
if(c.getSmoke()==Smoke.MIX){
if(i==0){
if(pos[1].getPet()!=Pet.Cat)return false;
}else if(i==4){
if(pos[3].getPet()!=Pet.Cat)return false;
}else{
if(pos[i-1].getPet()!=Pet.Cat&&pos[i+1].getPet()!=Pet.Cat)return false;
}
}
//11.养马人住在抽DUNHILL烟人的旁边
if(c.getPet() == Pet.Horse){
if(i==0){
if(pos[1].getSmoke()!=Smoke.DUNHILL)return false;
}else if(i==4){
if(pos[3].getSmoke()!=Smoke.DUNHILL)return false;
}else{
if(pos[i-1].getSmoke()!=Smoke.DUNHILL&&pos[i+1].getSmoke()!=Smoke.DUNHILL)return false;
}
}
//12.抽BLUE MASTER 烟人喝啤酒
if(c.getSmoke()==Smoke.BLUEMASTER&&c.getDrink()!=Drink.Beer)return false;
//13.德国人抽Prince
if(c.getNation()==Nation.Germany&&c.getSmoke()!=Smoke.PRINCE)return false;
//14.挪威人住在蓝房子旁边
if(c.getNation() == Nation.Norway){
if(i==0){
if(pos[1].getHourseColor()!=Color.Blue)return false;
}else if(i==4){
if(pos[3].getHourseColor()!=Color.Blue)return false;
}else{
if(pos[i-1].getHourseColor()!=Color.Blue&&pos[i+1].getHourseColor()!=Color.Blue)return false;
}
}
//15.抽混合烟的人的邻居喝水
if(c.getSmoke()==Smoke.MIX){
if(i==0){
if(pos[1].getDrink()!=Drink.Water)return false;
}else if(i==4){
if(pos[3].getDrink()!=Drink.Water)return false;
}else{
if(pos[i-1].getDrink()!=Drink.Water&&pos[i+1].getDrink()!=Drink.Water)return false;
}
}
}
return true;
}
public void printCombine(Combine[] pos){
for(int i=0;i<5;i++){
Combine c = pos[i];
System.out.print(c.getHourseColor());
System.out.print(“,”+c.getNation());
System.out.print(“,”+c.getDrink());
System.out.print(“,”+c.getPet());
System.out.print(“,”+c.getSmoke());
System.out.println(“===============================”);
}
}
public static void main(String[] args) {
new Main().cal();
}
}





