爱因斯坦的谜题:
在一条街上有颜色互不相同的五栋房子,不同国籍的人分别住在这五栋房子力,每人抽不同品牌的香烟,喝不同的饮料,养不同的宠物。已知如下情况:
1. 英国人住红色房子里。
2. 瑞典人养狗。
3. 丹麦人喝茶。
4. 绿色房子坐落在白色房子的左面。
5. 绿色房子的主人喝咖啡。
6. 抽Pall Mall香烟的人养鸟。
7. 黄色房子的主人抽Dunhill香烟。
8. 挪威人住第一间房子。
9. 五座房子中间的那座的主人喝牛奶。
10. 抽Blends香烟的住在养猫人的隔壁。
11. 养马的人住在抽Dunhill香烟者的隔壁。
12. 抽Blue Master香烟的喝啤酒。
13. 德国人抽Prince香烟。
14. 挪威人住的房子在蓝色房子的隔壁。
15. 抽Blends香烟的人有一个喝水的邻居。
问:谁养鱼?
谜题的英文原文:
Let us assume that there are five houses of different colors next
to each other on the same road.
In each house lives a man of a different nationality. Every man has
his favorite drink, his
favorite brand of cigarettes, and keeps pets of a particular
kind.
1.The Englishman lives in the red house.
2.The Swede keeps dogs.
3.The Dane drinks tea.
4.The green house is just to the left of the white one.
5.The owner of the green house drinks coffee.
6.The Pall Mall smoker keeps birds.
7.The owner of the yellow house smokes Dunhills.
8.The man in the center house drinks milk.
9.The Norwegian lives in the first house.
10.The Blend smoker has a neighbor who keeps cats.
11.The man who smokes Blue Masters drinks bier.
12.The man who keeps horses lives next to the Dunhill smoker.
13.The German smokes Prince.
14.The Norwegian lives next to the blue house.
15.The Blend smoker has a neighbor who drinks water.
The question to be answered is: Who keeps fish?
这道迷题出自1981年柏林的德国逻辑思考学院。据说世界上只有2%的人能出答案。就连大名鼎鼎的爱因斯坦也成为此题大伤脑筋,所以这道题也经常被国内外知名公司用做面试题目,相信许多朋友都只做出过一个答案,今天就用计算机来看看答案:
000001 package
my.code.reflectTest;
000002
000003
000009 public
class WhoFeedsFish {
000010
000011
private static final String problem = "爱因斯坦的推理题:\n\n" +
"1.有5栋5种颜色的房子\n"
000012
+ "2.每一位房子的主人国籍都不同\n" +
"3.这五个人每人只喝一个牌子的饮料,只抽一个牌子的香烟,只养一种宠物\n"
000013
+ "4.没有人有相同的宠物,抽相同牌子的烟,喝相同牌子的饮料\n\n" + "已知条件:\n" +
"1.英国人住在红房子里\n"
000014
+ "2.瑞典人养了一条狗\n" + "3.丹麦人喝茶\n" + "4.绿房子在白房子的左边\n" +
"5.绿房子主人喝咖啡\n"
000015
+ "6.抽pallmall烟的人养了一只鸟\n" + "7.黄房子主人抽dunhill烟\n"
000016
+ "8.住在中间房子的人喝牛奶\n" + "9.挪威人住在第一间房子\n"
000017
+ "10.抽Blue Master的人住在养猫人的旁边\n" + "11.养马人住在抽dunhill烟人的旁边\n"
000018
+ "12.抽bluemaster烟的人喝啤酒\n" + "13.德国人抽prince烟\n" +
"14.挪威人住在蓝房子旁边\n"
000019
+ "15.抽Blue Master的人的邻居喝矿泉水\n\n" + "问题:谁养鱼?\n";
000020
000021
000024
public String getProblem() {
000025 return
problem;
000026
}
000027
000028
private static final int
NATIONALITY_ENGLISH = 1;
000029
private static final int
NATIONALITY_SWIDISH = 2;
000030
private static final int
NATIONALITY_DAMARK = 3;
000031
private static final int
NATIONALITY_NORWAY = 4;
000032
private static final int
NATIONALITY_GERMAN = 5;
000033
private int[] nationalities = new int[5];
000034
000035
private static final int
COLOR_RED = 1;
000036
private static final int
COLOR_GREEN = 2;
000037
private static final int
COLOR_YELLOW = 3;
000038
private static final int
COLOR_WHITE = 4;
000039
private static final int
COLOR_BLUE = 5;
000040
private int[] colors = new int[5];
000041
000042
private static final int
PET_DOG = 1;
000043
private static final int
PET_BIRD = 2;
000044
private static final int
PET_CAT = 3;
000045
private static final int
PET_HORSE = 4;
000046
private static final int
PET_FISH = 5;
000047
private int[] pets = new int[5];
000048
000049
private static final int
DRINK_TEA = 1;
000050
private static final int
DRINK_COFFEE = 2;
000051
private static final int
DRINK_MILK = 3;
000052
private static final int
DRINK_BEER = 4;
000053
private static final int
DRINK_WATER = 5;
000054
private int[] drinks = new int[5];
000055
000056
private static final int
TOBACCO_PALLMALL = 1;
000057
private static final int
TOBACCO_DUNHILL = 2;
000058
private static final int
TOBACCO_BLUEMASTER = 3;
000059
private static final int
TOBACCO_PRINCE = 4;
000060
private static final int
TOBACCO_MIXED = 5;
000061
private int[] tobaccoes = new int[5];
000062
000063
// 5*5的二维数组,答案就在其中:
000064
private int[][] key = { nationalities, colors, pets,
drinks, tobaccoes };
000065
000066
private static final int[][]
values = { { 1, 2, 3, 4, 5 },
000067
{ 1, 2, 3, 5, 4 }, { 1, 2, 4, 3, 5 }, { 1, 2, 4, 5, 3 },
000068
{ 1, 2, 5, 3, 4 }, { 1, 2, 5, 4, 3 }, { 1, 3, 2, 4, 5 },
000069
{ 1, 3, 2, 5, 4 }, { 1, 3, 4, 2, 5 }, { 1, 3, 4, 5, 2 },
000070
{ 1, 3, 5, 2, 4 }, { 1, 3, 5, 4, 2 }, { 1, 4, 2, 3, 5 },
000071
{ 1, 4, 2, 5, 3 }, { 1, 4, 3, 2, 5 }, { 1, 4, 3, 5, 2 },
000072
{ 1, 4, 5, 2, 3 }, { 1, 4, 5, 3, 2 }, { 1, 5, 2, 3, 4 },
000073
{ 1, 5, 2, 4, 3 }, { 1, 5, 3, 2, 4 }, { 1, 5, 3, 4, 2 },
000074
{ 1, 5, 4, 2, 3 }, { 1, 5, 4, 3, 2 }, { 2, 1, 3, 4, 5 },
000075
{ 2, 1, 3, 5, 4 }, { 2, 1, 4, 3, 5 }, { 2, 1, 4, 5, 3 },
000076
{ 2, 1, 5, 3, 4 }, { 2, 1, 5, 4, 3 }, { 2, 3, 1, 4, 5 },
000077
{ 2, 3, 1, 5, 4 }, { 2, 3, 4, 1, 5 }, { 2, 3, 4, 5, 1 },
000078
{ 2, 3, 5, 1, 4 }, { 2, 3, 5, 4, 1 }, { 2, 4, 1, 3, 5 },
000079
{ 2, 4, 1, 5, 3 }, { 2, 4, 3, 1, 5 }, { 2, 4, 3, 5, 1 },
000080
{ 2, 4, 5, 1, 3 }, { 2, 4, 5, 3, 1 }, { 2, 5, 1, 3, 4 },
000081
{ 2, 5, 1, 4, 3 }, { 2, 5, 3, 1, 4 }, { 2, 5, 3, 4, 1 },
000082
{ 2, 5, 4, 1, 3 }, { 2, 5, 4, 3, 1 }, { 3, 1, 2, 4, 5 },
000083
{ 3, 1, 2, 5, 4 }, { 3, 1, 4, 2, 5 }, { 3, 1, 4, 5, 2 },
000084
{ 3, 1, 5, 2, 4 }, { 3, 1, 5, 4, 2 }, { 3, 2, 1, 4, 5 },
000085
{ 3, 2, 1, 5, 4 }, { 3, 2, 4, 1, 5 }, { 3, 2, 4, 5, 1 },
000086
{ 3, 2, 5, 1, 4 }, { 3, 2, 5, 4, 1 }, { 3, 4, 1, 2, 5 },
000087
{ 3, 4, 1, 5, 2 }, { 3, 4, 2, 1, 5 }, { 3, 4, 2, 5, 1 },
000088
{ 3, 4, 5, 1, 2 }, { 3, 4, 5, 2, 1 }, { 3, 5, 1, 2, 4 },
000089
{ 3, 5, 1, 4, 2 }, { 3, 5, 2, 1, 4 }, { 3, 5, 2, 4, 1 },
000090
{ 3, 5, 4, 1, 2 }, { 3, 5, 4, 2, 1 }, { 4, 1, 2, 3, 5 },
000091
{ 4, 1, 2, 5, 3 }, { 4, 1, 3, 2, 5 }, { 4, 1, 3, 5, 2 },
000092
{ 4, 1, 5, 2, 3 }, { 4, 1, 5, 3, 2 }, { 4, 2, 1, 3, 5 },
000093
{ 4, 2, 1, 5, 3 }, { 4, 2, 3, 1, 5 }, { 4, 2, 3, 5, 1 },
000094
{ 4, 2, 5, 1, 3 }, { 4, 2, 5, 3, 1 }, { 4, 3, 1, 2, 5 },
000095
{ 4, 3, 1, 5, 2 }, { 4, 3, 2, 1, 5 }, { 4, 3, 2, 5, 1 },
000096
{ 4, 3, 5, 1, 2 }, { 4, 3, 5, 2, 1 }, { 4, 5, 1, 2, 3 },
000097
{ 4, 5, 1, 3, 2 }, { 4, 5, 2, 1, 3 }, { 4, 5, 2, 3, 1 },
000098
{ 4, 5, 3, 1, 2 }, { 4, 5, 3, 2, 1 }, { 5, 1, 2, 3, 4 },
000099
{ 5, 1, 2, 4, 3 }, { 5, 1, 3, 2, 4 }, { 5, 1, 3, 4, 2 },
000100
{ 5, 1, 4, 2, 3 }, { 5, 1, 4, 3, 2 }, { 5, 2, 1, 3, 4 },
000101
{ 5, 2, 1, 4, 3 }, { 5, 2, 3, 1, 4 }, { 5, 2, 3, 4, 1 },
000102
{ 5, 2, 4, 1, 3 }, { 5, 2, 4, 3, 1 }, { 5, 3, 1, 2, 4 },
000103
{ 5, 3, 1, 4, 2 }, { 5, 3, 2, 1, 4 }, { 5, 3, 2, 4, 1 },
000104
{ 5, 3, 4, 1, 2 }, { 5, 3, 4, 2, 1 }, { 5, 4, 1, 2, 3 },
000105
{ 5, 4, 1, 3, 2 }, { 5, 4, 2, 1, 3 }, { 5, 4, 2, 3, 1 },
000106
{ 5, 4, 3, 1, 2 }, { 5, 4, 3, 2, 1 } };
000107
000108
public void printKey() {
000109 for
(int i = 0; i < 5; i++)
{
000110
print("nationality", key[0][i]);
000111 }
000112 System.out.println();
000113 for
(int i = 0; i < 5; i++)
{
000114
print("color", key[1][i]);
000115 }
000116 System.out.println();
000117 for
(int i = 0; i < 5; i++)
{
000118
print("pet", key[2][i]);
000119 }
000120 System.out.println();
000121 for
(int i = 0; i < 5; i++)
{
000122
print("drink", key[3][i]);
000123 }
000124 System.out.println();
000125 for
(int i = 0; i < 5; i++)
{
000126
print("tobacco", key[4][i]);
000127 }
000128 System.out.println();
000129
000130
}
000131
000132
private void print(String item, int index) {
000133 if
(false) {
000134 }
else if
("nationality".equals(item)) {
000135
switch (index) {
000136
case 1:
000137 System.out.print("英国人\t");
000138 break;
000139
case 2:
000140 System.out.print("瑞典人\t");
000141 break;
000142
case 3:
000143 System.out.print("丹麦人\t");
000144 break;
000145
case 4:
000146 System.out.print("挪威人\t");
000147 break;
000148
case 5:
000149 System.out.print("德国人\t");
000150 break;
000151
}
000152 }
else if
("color".equals(item)) {
000153
switch (index) {
000154
case 1:
000155 System.out.print("红房子\t");
000156 break;
000157
case 2:
000158 System.out.print("绿房子\t");
000159 break;
000160
case 3:
000161 System.out.print("黄房子\t");
000162 break;
000163
case 4:
000164 System.out.print("白房子\t");
000165 break;
000166
case 5:
000167 System.out.print("蓝房子\t");
000168 break;
000169
}
000170 }
else if
("pet".equals(item)) {
000171
switch (index) {
000172
case 1:
000173 System.out.print("狗\t");
000174 break;
000175
case 2:
000176 System.out.print("鸟\t");
000177 break;
000178
case 3:
000179 System.out.print("猫\t");
000180 break;
000181
case 4:
000182 System.out.print("马\t");
000183 break;
000184
case 5:
000185 System.out.print("鱼\t");
000186 break;
000187
}
000188 }
else if
("drink".equals(item)) {
000189
switch (index) {
000190
case 1:
000191 System.out.print("茶\t");
000192 break;
000193
case 2:
000194 System.out.print("咖啡\t");
000195 break;
000196
case 3:
000197 System.out.print("牛奶\t");
000198 break;
000199
case 4:
000200 System.out.print("啤酒\t");
000201 break;
000202
case 5:
000203 System.out.print("水\t");
000204 break;
000205
}
000206 }
else if
("tobacco".equals(item)) {
000207
switch (index) {
000208
case 1:
000209 System.out.print("PALLMALL\t");
000210 break;
000211
case 2:
000212 System.out.print("DUNHILL\t");
000213 break;
000214
case 3:
000215 System.out.print("BLUEMASTER\t");
000216 break;
000217
case 4:
000218 System.out.print("PRINCE\t");
000219 break;
000220
case 5:
000221 System.out.print("Blue
Master\t");
000222 break;
000223
}
000224 }
000225
}
000226
000227
// 条件1:英国人住在红房子里 01
000228
private boolean check01() {
000229 for
(int i = 0; i <
nationalities.length; i++) {
000230
if (key[0][i] == NATIONALITY_ENGLISH)
{
000231 if
(key[1][i] != COLOR_RED) {
000232
return false;
000233 }
else {
000234
return true;
000235 }
000236
}
000237 }
000238 return
false;
000239
}
000240
000241
// 条件2:瑞典人养了一条狗 02
000242
private boolean check02() {
000243 for
(int i = 0; i <
nationalities.length; i++) {
000244
if (key[0][i] == NATIONALITY_SWIDISH)
{
000245 if
(key[2][i] != PET_DOG) {
000246
return false;
000247 }
else {
000248
return true;
000249 }
000250
}
000251 }
000252 return
false;
000253
}
000254
000255
// 条件4:绿房子在白房子的左边 1
000256
private boolean check1() {
000257 for
(int i = 0; i <
colors.length; i++) {
000258
if (key[1][i] == COLOR_GREEN) {
000259 for
(int j = 0; j <
colors.length; j++) {
000260
if (key[1][j] == COLOR_WHITE) {
000261 if
(i > j) {
000262
return false;
000263 }
else {
000264
return true;
000265 }
000266
}
000267 }
000268
}
000269 }
000270 return
false;
000271
}
000272
000273
// 条件8:住在中间房子的人喝牛奶 3
000274
private boolean check3() {
000275 return
key[3][2] == DRINK_MILK ? true : false;
000276
}
000277
000278
// 条件9:挪威人住在第一间房子 0
000279
private boolean check0() {
000280 if
(key[0][0] != NATIONALITY_NORWAY) {
000281
return false;
000282 }
000283 return
true;
000284
}
000285
000286
// 14.挪威人住在蓝房子旁边 01
000287
private boolean check011() {
000288 for
(int i = 0; i <
nationalities.length; i++) {
000289
if (key[0][i] == NATIONALITY_NORWAY)
{
000290 for
(int j = 0; j <
colors.length; j++) {
000291
if (key[1][j] == COLOR_BLUE) {
000292 if
(Math.abs(i - j) == 1) {
000293
return true;
000294 }
else {
000295
return false;
000296