========================================Start========================================
答案1
挪威人 丹麦人 英国人 德国人 瑞典人
黄房子 蓝房子 红房子 绿房子 白房子
猫 马 鸟 鱼 狗
水 茶 牛奶 咖啡 啤酒
DUNHILL 混合烟 PALLMALL PRINCE BLUEMASTER
-------------------------------------------------------------------------------------
答案2
挪威人 德国人 英国人 丹麦人 瑞典人
绿房子 蓝房子 红房子 黄房子 白房子
鸟 猫 马 鱼 狗
咖啡 水 牛奶 茶 啤酒
PALLMALL PRINCE 混合烟 DUNHILL BLUEMASTER
-------------------------------------------------------------------------------------
答案3
挪威人 德国人 英国人 丹麦人 瑞典人
绿房子 蓝房子 红房子 黄房子 白房子
鸟 鱼 马 猫 狗
咖啡 水 牛奶 茶 啤酒
PALLMALL PRINCE 混合烟 DUNHILL BLUEMASTER
-------------------------------------------------------------------------------------
答案4
挪威人 德国人 瑞典人 英国人 丹麦人
绿房子 蓝房子 黄房子 红房子 白房子
鱼 猫 狗 马 鸟
咖啡 水 牛奶 啤酒 茶
混合烟 PRINCE DUNHILL BLUEMASTER PALLMALL
-------------------------------------------------------------------------------------
答案5
挪威人 德国人 瑞典人 英国人 丹麦人
绿房子 蓝房子 白房子 红房子 黄房子
鸟 猫 狗 马 鱼
咖啡 水 牛奶 啤酒 茶
PALLMALL PRINCE 混合烟 BLUEMASTER DUNHILL
-------------------------------------------------------------------------------------
答案6
挪威人 德国人 瑞典人 丹麦人 英国人
绿房子 蓝房子 白房子 黄房子 红房子
鸟 猫 狗 鱼 马
咖啡 水 牛奶 茶 啤酒
PALLMALL PRINCE 混合烟 DUNHILL BLUEMASTER
-------------------------------------------------------------------------------------
答案7
挪威人 德国人 瑞典人 丹麦人 英国人
绿房子 蓝房子 白房子 黄房子 红房子
鸟 鱼 狗 猫 马
咖啡 水 牛奶 茶 啤酒
PALLMALL PRINCE 混合烟 DUNHILL BLUEMASTER
-------------------------------------------------------------------------------------
========================================End==========================================
java代码:
/* * Created on 2005-11-8 * * TODO To change the template for this generated file go to * Window - Preferences - Java - Code Style - Code Templates */package com.netengine.test;/** * @author cds * * TODO To change the template for this generated type comment go to * Window - Preferences - Java - Code Style - Code Templates */public class WhoFeedsFish { private static final String problem = "爱因斯坦的推理题:\n\n"+ "1.有5栋5种颜色的房子\n"+ "2.每一位房子的主人国籍都不同\n"+ "3.这五个人每人只喝一个牌子的饮料,只抽一个牌子的香烟,只养一种宠物\n"+ "4.没有人有相同的宠物,抽相同牌子的烟,喝相同牌子的饮料\n\n"+ "已知条件:\n"+ "1.英国人住在红房子里\n"+ "2.瑞典人养了一条狗\n"+ "3.丹麦人喝茶\n"+ "4.绿房子在白房子的左边\n"+ "5.绿房子主人喝咖啡\n"+ "6.抽pallmall烟的人养了一只鸟\n"+ "7.黄房子主人抽dunhill烟\n"+ "8.住在中间房子的人喝牛奶\n"+ "9.挪威人住在第一间房子\n"+ "10.抽混合烟的人住在养猫人的旁边\n"+ "11.养马人住在抽dunhill烟人的旁边\n"+ "12.抽bluemaster烟的人喝啤酒\n"+ "13.德国人抽prince烟\n"+ "14.挪威人住在蓝房子旁边\n"+ "15.抽混合烟的人的邻居喝矿泉水\n\n"+ "问题:谁养鱼?\n"; /** * @return Returns the problem. */ public String getProblem() { return problem; } private static final int NATIONALITY_ENGLISH = 1; private static final int NATIONALITY_SWIDISH = 2; private static final int NATIONALITY_DAMARK = 3; private static final int NATIONALITY_NORWAY = 4; private static final int NATIONALITY_GERMAN = 5; private int[] nationalities = new int[5]; private static final int COLOR_RED = 1; private static final int COLOR_GREEN = 2; private static final int COLOR_YELLOW = 3; private static final int COLOR_WHITE = 4; private static final int COLOR_BLUE = 5; private int[] colors = new int[5]; private static final int PET_DOG = 1; private static final int PET_BIRD = 2; private static final int PET_CAT = 3; private static final int PET_HORSE = 4; private static final int PET_FISH = 5; private int[] pets = new int[5]; private static final int DRINK_TEA = 1; private static final int DRINK_COFFEE = 2; private static final int DRINK_MILK = 3; private static final int DRINK_BEER = 4; private static final int DRINK_WATER = 5; private int[] drinks = new int[5]; private static final int TOBACCO_PALLMALL = 1; private static final int TOBACCO_DUNHILL = 2; private static final int TOBACCO_BLUEMASTER = 3; private static final int TOBACCO_PRINCE = 4; private static final int TOBACCO_MIXED = 5; private int[] tobaccoes = new int[5]; //5*5的二维数组,答案就在其中: private int[][] key ={nationalities,colors,pets,drinks,tobaccoes}; private static final int[][] values = { {1,2,3,4,5}, {1,2,3,5,4}, {1,2,4,3,5}, {1,2,4,5,3}, {1,2,5,3,4}, {1,2,5,4,3}, {1,3,2,4,5}, {1,3,2,5,4}, {1,3,4,2,5}, {1,3,4,5,2}, {1,3,5,2,4}, {1,3,5,4,2}, {1,4,2,3,5}, {1,4,2,5,3}, {1,4,3,2,5}, {1,4,3,5,2}, {1,4,5,2,3}, {1,4,5,3,2}, {1,5,2,3,4}, {1,5,2,4,3}, {1,5,3,2,4}, {1,5,3,4,2}, {1,5,4,2,3}, {1,5,4,3,2}, {2,1,3,4,5}, {2,1,3,5,4}, {2,1,4,3,5}, {2,1,4,5,3}, {2,1,5,3,4}, {2,1,5,4,3}, {2,3,1,4,5}, {2,3,1,5,4}, {2,3,4,1,5}, {2,3,4,5,1}, {2,3,5,1,4}, {2,3,5,4,1}, {2,4,1,3,5}, {2,4,1,5,3}, {2,4,3,1,5}, {2,4,3,5,1}, {2,4,5,1,3}, {2,4,5,3,1}, {2,5,1,3,4}, {2,5,1,4,3}, {2,5,3,1,4}, {2,5,3,4,1}, {2,5,4,1,3}, {2,5,4,3,1}, {3,1,2,4,5}, {3,1,2,5,4}, {3,1,4,2,5}, {3,1,4,5,2}, {3,1,5,2,4}, {3,1,5,4,2}, {3,2,1,4,5}, {3,2,1,5,4}, {3,2,4,1,5}, {3,2,4,5,1}, {3,2,5,1,4}, {3,2,5,4,1}, {3,4,1,2,5}, {3,4,1,5,2}, {3,4,2,1,5}, {3,4,2,5,1}, {3,4,5,1,2}, {3,4,5,2,1}, {3,5,1,2,4}, {3,5,1,4,2}, {3,5,2,1,4}, {3,5,2,4,1}, {3,5,4,1,2}, {3,5,4,2,1}, {4,1,2,3,5}, {4,1,2,5,3}, {4,1,3,2,5}, {4,1,3,5,2}, {4,1,5,2,3}, {4,1,5,3,2}, {4,2,1,3,5}, {4,2,1,5,3}, {4,2,3,1,5}, {4,2,3,5,1}, {4,2,5,1,3}, {4,2,5,3,1}, {4,3,1,2,5}, {4,3,1,5,2}, {4,3,2,1,5}, {4,3,2,5,1}, {4,3,5,1,2}, {4,3,5,2,1}, {4,5,1,2,3}, {4,5,1,3,2}, {4,5,2,1,3}, {4,5,2,3,1}, {4,5,3,1,2}, {4,5,3,2,1}, {5,1,2,3,4}, {5,1,2,4,3}, {5,1,3,2,4}, {5,1,3,4,2}, {5,1,4,2,3}, {5,1,4,3,2}, {5,2,1,3,4}, {5,2,1,4,3}, {5,2,3,1,4}, {5,2,3,4,1}, {5,2,4,1,3}, {5,2,4,3,1}, {5,3,1,2,4}, {5,3,1,4,2}, {5,3,2,1,4}, {5,3,2,4,1}, {5,3,4,1,2}, {5,3,4,2,1}, {5,4,1,2,3}, {5,4,1,3,2}, {5,4,2,1,3}, {5,4,2,3,1}, {5,4,3,1,2}, {5,4,3,2,1} }; public void printKey(){ for(int i = 0; i < 5; i ++){ print("nationality",key[0][i]); } System.out.println(); for(int i = 0; i < 5; i ++){ print("color",key[1][i]); } System.out.println(); for(int i = 0; i < 5; i ++){ print("pet",key[2][i]); } System.out.println(); for(int i = 0; i < 5; i ++){ print("drink",key[3][i]); } System.out.println(); for(int i = 0; i < 5; i ++){ print("tobacco",key[4][i]); } System.out.println(); } private void print(String item,int index){ if(false){ }else if("nationality".equals(item)){ switch(index){ case 1: System.out.print("英国人\t"); break; case 2: System.out.print("瑞典人\t"); break; case 3: System.out.print("丹麦人\t"); break; case 4: System.out.print("挪威人\t"); break; case 5: System.out.print("德国人\t"); break; } }else if("color".equals(item)){ switch(index){ case 1: System.out.print("红房子\t"); break; case 2: System.out.print("绿房子\t"); break; case 3: System.out.print("黄房子\t"); break; case 4: System.out.print("白房子\t"); break; case 5: System.out.print("蓝房子\t"); break; } }else if("pet".equals(item)){ switch(index){ case 1: System.out.print("狗\t"); break; case 2: System.out.print("鸟\t"); break; case 3: System.out.print("猫\t"); break; case 4: System.out.print("马\t"); break; case 5: System.out.print("鱼\t"); break; } }else if("drink".equals(item)){ switch(index){ case 1: System.out.print("茶\t"); break; case 2: System.out.print("咖啡\t"); break; case 3: System.out.print("牛奶\t"); break; case 4: System.out.print("啤酒\t"); break; case 5: System.out.print("水\t"); break; } }else if("tobacco".equals(item)){ switch(index){ case 1: System.out.print("PALLMALL\t"); break; case 2: System.out.print("DUNHILL\t"); break; case 3: System.out.print("BLUEMASTER\t"); break; case 4: System.out.print("PRINCE\t"); break; case 5: System.out.print("混合烟\t"); break; } } }// 条件1:英国人住在红房子里 01 private boolean check01(){ for(int i = 0; i < nationalities.length; i ++){ if(key[0][i] == NATIONALITY_ENGLISH){ if(key[1][i] != COLOR_RED){ return false; } else{ return true; } } } return false; } // 条件2:瑞典人养了一条狗 02 private boolean check02(){ for(int i = 0; i < nationalities.length; i ++){ if(key[0][i] == NATIONALITY_SWIDISH){ if(key[2][i] != PET_DOG){ return false; } else{ return true; } } } return false; }// 条件4:绿房子在白房子的左边 1 private boolean check1(){ for(int i = 0; i < colors.length; i ++){ if(key[1][i] == COLOR_GREEN){ for(int j = 0; j < colors.length; j ++){ if(key[1][j] == COLOR_WHITE){ if(i > j){ return false; } else{ return true; } } } } } return false; } // 条件8:住在中间房子的人喝牛奶 3 private boolean check3(){ return key[3][2] == DRINK_MILK?true:false; } // 条件9:挪威人住在第一间房子 0 private boolean check0(){ if(key[0][0] != NATIONALITY_NORWAY){ return false; } return true; } // 14.挪威人住在蓝房子旁边 01 private boolean check011(){ for(int i = 0; i < nationalities.length; i ++){ if(key[0][i] == NATIONALITY_NORWAY){ for(int j = 0; j < colors.length; j ++){ if(key[1][j] == COLOR_BLUE){ if(Math.abs(i - j) == 1){ return true; }else{ return false; } } } } } return false; } /////////////////////////////////////////////////////////////////// //条件1,2,3,4,8,9,14被拿出来提前检测(预检测以去除不必要的操作,减少执行时间) private boolean check(){// 条件3:丹麦人喝茶 03 for(int i = 0; i < nationalities.length; i ++){ if(key[0][i] == NATIONALITY_DAMARK){ if(key[3][i] != DRINK_TEA){ return false; } else{ break; } } }// 条件5:绿房子主人喝咖啡 13 for(int i = 0; i < colors.length; i ++){ if(key[1][i] == COLOR_GREEN){ if(key[3][i] != DRINK_COFFEE){ return false; } else{ break; } } } // 条件6:抽pallmall烟的人养了一只鸟 24 for(int i = 0; i < tobaccoes.length; i ++){ if(key[4][i] == TOBACCO_PALLMALL){ if(key[2][i] != PET_BIRD){ return false; } else{ break; } } }
参考资料:
http://www.matrix.org.cn/resource/article/43/43941_java.html