电脑技术学习

爱因斯坦谜题的java解答方法

dn001
内容: 爱因斯坦的推理题:

1.有5栋5种颜色的房子
2.每一位房子的主人国籍都不同
3.这五个人每人只喝一个牌子的饮料,只抽一个牌子的香烟,只养一种宠物
4.没有人有相同的宠物,抽相同牌子的烟,喝相同牌子的饮料

已知条件:
1.英国人住在红房子里
2.瑞典人养了一条狗
3.丹麦人喝茶
4.绿房子在白房子的左边
5.绿房子主人喝咖啡
6.抽pallmall烟的人养了一只鸟
7.黄房子主人抽dunhill烟
8.住在中间房子的人喝牛奶
9.挪威人住在第一间房子
10.抽混合烟的人住在养猫人的旁边
11.养马人住在抽dunhill烟人的旁边
12.抽bluemaster烟的人喝啤酒
13.德国人抽prince烟
14.挪威人住在蓝房子旁边
15.抽混合烟的人的邻居喝矿泉水

问题:谁养鱼?

========================================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 = "爱因斯坦的推理题:nn"+
"1.有5栋5种颜色的房子n"+
"2.每一位房子的主人国籍都不同n"+
"3.这五个人每人只喝一个牌子的饮料,只抽一个牌子的香烟,只养一种宠物n"+
"4.没有人有相同的宠物,抽相同牌子的烟,喝相同牌子的饮料nn"+
"已知条件: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.抽混合烟的人的邻居喝矿泉水nn"+
"问题:谁养鱼?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("PALLMALLt");
break;
case 2:
System.out.print("DUNHILLt");
break;
case 3:
System.out.print("BLUEMASTERt");
break;
case 4:
System.out.print("PRINCEt");
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;
}
}
}

// 条件7:黄房子主人抽dunhill烟 14
for(int i = 0; i < colors.length; i ++){
if(key[1][i] == COLOR_YELLOW){
if(key[4][i] != TOBACCO_DUNHILL){
return false;
}
else{
break;
}
}
}

// 条件10:抽混合烟的人住在养猫人的旁边 24
for(int i = 0; i < tobaccoes.length; i ++){
if(key[4][i] == TOBACCO_MIXED){
for(int j = 0; j < pets.length; j ++){
if(key[2][j] == PET_CAT){
if(i - j != 1 && i - j != -1){
return false;
}
break;
}
}
break;
}
}

// 条件11:养马人住在抽dunhill烟人的旁边 24
for(int i = 0; i < pets.length; i ++){
if(key[2][i] == PET_HORSE){
for(int j = 0; j < tobaccoes.length; j ++){
if(key[4][j] == TOBACCO_DUNHILL){
if(i - j != 1 && i - j != -1){
return false;
}
break;
}
}
break;
}
}

// 条件12:抽bluemaster烟的人喝啤酒 34
for(int i = 0; i < tobaccoes.length; i ++){
if(key[4][i] == TOBACCO_BLUEMASTER){
if(key[3][i] != DRINK_BEER){
return false;
}
else{
break;
}
}
}

// 13.德国人抽prince烟 04
for(int i = 0; i < nationalities.length; i ++){
if(key[0][i] == NATIONALITY_GERMAN){
if(key[4][i] != TOBACCO_PRINCE){
return false;
}
else{
break;
}
}
}

// 15.抽混合烟的人的邻居喝矿泉水 34
for(int i = 0; i < tobaccoes.length; i ++){
if(key[4][i] == TOBACCO_MIXED){
for(int j = 0; j < drinks.length; j ++){
if(key[3][j] == DRINK_WATER){
if((i - j != 1) && (i - j != -1)){
return false;
}
else{
break;
}
}
}
break;
}
}
//满足所有条件:
return true;
}

public void run(){
int count = 0;
for(int a = 0; a < 120; a ++){
for(int i = 0; i < 5; i ++){
key[0][i] = values[a][i];
}
if(!check0()){continue;}

for(int b = 0; b < 120; b ++){
for(int i = 0; i < 5; i ++){
key[1][i] = values[b][i];
}
if(!check01() || !check011() || !check1()){continue;}

for(int c = 0; c < 120; c ++){
for(int i = 0; i < 5; i ++){
key[2][i] = values[c][i];
}
if(!check02()){continue;}

for(int d = 0; d < 120; d ++){
for(int i = 0; i < 5; i ++){
key[3][i] = values[d][i];
}
if(!check3()){continue;}

for(int e = 0; e < 120; e ++){
for(int i = 0; i < 5; i ++){
key[4][i] = values[e][i];
}
if(!check()){continue;}
System.out.println("答案" + (++count));
printKey();
System.out.println("-----------------------------------------------"+
"--------------------------------------");

}

}

}

}
}
}

public static void main(String[] args){
WhoFeedsFish wff = new WhoFeedsFish();
System.out.println(wff.getProblem());
System.out.println("========================================Start========================================");
wff.run();
System.out.println("========================================End==========================================");
}

}
Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd 爱因斯坦的推理题:

1.有5栋5种颜色的房子
2.每一位房子的主人国籍都不同
标签: