爱因斯坦的谜题:
在一条街上有颜色互不相同的五栋房子,不同国籍的人分别住在这五栋房子力,每人抽不同品牌的香烟,喝不同的饮料,养不同的宠物。已知如下情况:
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