/**
*
* @author jia.hej
*
* 爱因斯坦推理题:谁养鱼
*
* 1、在一条街上,有5座房子,喷了5种颜色。
*
* 2、每个房里住着不同国籍的人
*
* 3、每个人喝不同的饮料,抽不同品牌的香烟,养不同的宠物
*
* 问题是:谁养鱼?
*
* 提示:
*
* 1、英国人住红色房子
*
* 2、瑞典人养狗
*
* 3、丹麦人喝茶
*
* 4、绿色房子在白色房子左面
*
* 5、绿色房子主人喝咖啡
*
* 6、抽PallMall香烟的人养鸟
*
* 7、黄色房子主人抽Dunhill香烟
*
* 8、住在中间房子的人喝牛奶
*
* 9、 挪威人住第一间房
*
* 10、抽Blends香烟的人住在养猫的人隔壁
*
* 11、养马的人住在抽Dunhill香烟的人隔壁
*
* 12、抽BlueMaster的人喝啤酒
*
* 13、德国人抽Prince香烟
*
* 14、挪威人住蓝色房子隔壁
*
* 15、抽Blends香烟的人有一个喝水的邻居
*
*
* 爱因斯坦在20世纪初出的这个谜语。他说世界上有98%的人答不出来。
*
*/
public class Fish {
private static int count = 0;
//----------------------初始化---------------------//
/** 国籍 */
private static final String[] COUNTRY = { "丹麦", "英国", "德国", "挪威", "瑞典" };
/** 房间 */
private static final String[] ROOM = { "蓝色", "绿色", "红色", "白色", "黄色" };
/** 饮料 */
private static final String[] DRINK = { "啤酒", "咖啡", "牛奶", "茶", "水" };
/** 烟 */
private static final String[] SMOKE = { "BLENDS", "BLUEMASTER", "DUNHILL", "PALLMALL",
"PRINCE" };
/** 宠物 */
private static final String[] PET = { "鸟", "猫", "狗", "鱼", "马" };
/** 国籍 */
private static int[] COUNTRY_INDEX = { 0, 1, 2, 3, 4 };
/** 房间 */
private static int[] ROOM_INDEX = { 0, 1, 2, 3, 4 };
/** 饮料 */
private static int[] DRINK_INDEX = { 0, 1, 2, 3, 4 };
/** 烟 */
private static int[] SMOKE_INDEX = { 0, 1, 2, 3, 4 };
/** 宠物 */
private static int[] PET_INDEX = { 0, 1, 2, 3, 4 };
//----------------------全排列---------------------//
private static final int[][] INDEX = { { 0, 1, 2, 3, 4 }, { 0, 1, 2, 4, 3 },
{ 0, 1, 3, 2, 4 }, { 0, 1, 3, 4, 2 }, { 0, 1, 4, 2, 3 }, { 0, 1, 4, 3, 2 },
{ 0, 2, 1, 3, 4 }, { 0, 2, 1, 4, 3 }, { 0, 2, 3, 1, 4 }, { 0, 2, 3, 4, 1 },
{ 0, 2, 4, 1, 3 }, { 0, 2, 4, 3, 1 }, { 0, 3, 1, 2, 4 }, { 0, 3, 1, 4, 2 },
{ 0, 3, 2, 1, 4 }, { 0, 3, 2, 4, 1 }, { 0, 3, 4, 1, 2 }, { 0, 3, 4, 2, 1 },
{ 0, 4, 1, 2, 3 }, { 0, 4, 1, 3, 2 }, { 0, 4, 2, 1, 3 }, { 0, 4, 2, 3, 1 },
{ 0, 4, 3, 1, 2 }, { 0, 4, 3, 2, 1 }, { 1, 0, 2, 3, 4 }, { 1, 0, 2, 4, 3 },
{ 1, 0, 3, 2, 4 }, { 1, 0, 3, 4, 2 }, { 1, 0, 4, 2, 3 }, { 1, 0, 4, 3, 2 },
{ 1, 2, 0, 3, 4 }, { 1, 2, 0, 4, 3 }, { 1, 2, 3, 0, 4 }, { 1, 2, 3, 4, 0 },
{ 1, 2, 4, 0, 3 }, { 1, 2, 4, 3, 0 }, { 1, 3, 0, 2, 4 }, { 1, 3, 0, 4, 2 },
{ 1, 3, 2, 0, 4 }, { 1, 3, 2, 4, 0 }, { 1, 3, 4, 0, 2 }, { 1, 3, 4, 2, 0 },
{ 1, 4, 0, 2, 3 }, { 1, 4, 0, 3, 2 }, { 1, 4, 2, 0, 3 }, { 1, 4, 2, 3, 0 },
{ 1, 4, 3, 0, 2 }, { 1, 4, 3, 2, 0 }, { 2, 0, 1, 3, 4 }, { 2, 0, 1, 4, 3 },
{ 2, 0, 3, 1, 4 }, { 2, 0, 3, 4, 1 }, { 2, 0, 4, 1, 3 }, { 2, 0, 4, 3, 1 },
{ 2, 1, 0, 3, 4 }, { 2, 1, 0, 4, 3 }, { 2, 1, 3, 0, 4 }, { 2, 1, 3, 4, 0 },
{ 2, 1, 4, 0, 3 }, { 2, 1, 4, 3, 0 }, { 2, 3, 0, 1, 4 }, { 2, 3, 0, 4, 1 },
{ 2, 3, 1, 0, 4 }, { 2, 3, 1, 4, 0 }, { 2, 3, 4, 0, 1 }, { 2, 3, 4, 1, 0 },
{ 2, 4, 0, 1, 3 }, { 2, 4, 0, 3, 1 }, { 2, 4, 1, 0, 3 }, { 2, 4, 1, 3, 0 },
{ 2, 4, 3, 0, 1 }, { 2, 4, 3, 1, 0 }, { 3, 0, 1, 2, 4 }, { 3, 0, 1, 4, 2 },
{ 3, 0, 2, 1, 4 }, { 3, 0, 2, 4, 1 }, { 3, 0, 4, 1, 2 }, { 3, 0, 4, 2, 1 },
{ 3, 1, 0, 2, 4 }, { 3, 1, 0, 4, 2 }, { 3, 1, 2, 0, 4 }, { 3, 1, 2, 4, 0 },
{ 3, 1, 4, 0, 2 }, { 3, 1, 4, 2, 0 }, { 3, 2, 0, 1, 4 }, { 3, 2, 0, 4, 1 },
{ 3, 2, 1, 0, 4 }, { 3, 2, 1, 4, 0 }, { 3, 2, 4, 0, 1 }, { 3, 2, 4, 1, 0 },
{ 3, 4, 0, 1, 2 }, { 3, 4, 0, 2, 1 }, { 3, 4, 1, 0, 2 }, { 3, 4, 1, 2, 0 },
{ 3, 4, 2, 0, 1 }, { 3, 4, 2, 1, 0 }, { 4, 0, 1, 2, 3 }, { 4, 0, 1, 3, 2 },
{ 4, 0, 2, 1, 3 }, { 4, 0, 2, 3, 1 }, { 4, 0, 3, 1, 2 }, { 4, 0, 3, 2, 1 },
{ 4, 1, 0, 2, 3 }, { 4, 1, 0, 3, 2 }, { 4, 1, 2, 0, 3 }, { 4, 1, 2, 3, 0 },
{ 4, 1, 3, 0, 2 }, { 4, 1, 3, 2, 0 }, { 4, 2, 0, 1, 3 }, { 4, 2, 0, 3, 1 },
{ 4, 2, 1, 0, 3 }, { 4, 2, 1, 3, 0 }, { 4, 2, 3, 0, 1 }, { 4, 2, 3, 1, 0 },
{ 4, 3, 0, 1, 2 }, { 4, 3, 0, 2, 1 }, { 4, 3, 1, 0, 2 }, { 4, 3, 1, 2, 0 },
{ 4, 3, 2, 0, 1 }, { 4, 3, 2, 1, 0 } };
public static void main(String[] args) {
//a、遍历COUNTRY
for (int a = 0; a < 120; a++) {
for (int b = 0; b < 5; b++) {
COUNTRY_INDEX[b] = INDEX[a][b];
}
if (!checkCondition9()) {
continue;
}
//b、遍历ROOM
for (int c = 0; c < 120; c++) {
for (int d = 0; d < 5; d++) {
ROOM_INDEX[d] = INDEX[c][d];
}
if (!checkCondition1() || !checkCondition4() || !checkCondition14()) {
continue;
}
//c、遍历DRINK
for (int e = 0; e < 120; e++) {
for (int f = 0; f < 5; f++) {
DRINK_INDEX[f] = INDEX[e][f];
}
if (!checkCondition3() || !checkCondition5() || !checkCondition8()) {
continue;
}
//d、遍历SMOKE
for (int g = 0; g < 120; g++) {
for (int h = 0; h < 5; h++) {
SMOKE_INDEX[h] = INDEX[g][h];
}
if (!checkCondition7() || !checkCondition12() || !checkCondition13()) {
continue;
}
//e、遍历PET
for (int i = 0; i < 120; i++) {
for (int j = 0; j < 5; j++) {
PET_INDEX[j] = INDEX[i][j];
}
if (!checkCondition2() || !checkCondition6() || !checkCondition10()
|| !checkCondition11() || !checkCondition15()) {
continue;
}
//output
System.out.println("--------------" + (++count) + "---------------");
for (int z = 0; z < COUNTRY_INDEX.length; z++) {
System.out.print(COUNTRY[COUNTRY_INDEX[z]] + "\t\t");
}
System.out.println();
for (int y = 0; y < ROOM_INDEX.length; y++) {
System.out.print(ROOM[ROOM_INDEX[y]] + "\t\t");
}
System.out.println();
for (int x = 0; x < DRINK_INDEX.length; x++) {
System.out.print(DRINK[DRINK_INDEX[x]] + "\t\t");
}
System.out.println();
for (int w = 0; w < SMOKE_INDEX.length; w++) {
System.out.print(SMOKE[SMOKE_INDEX[w]] + "\t\t");
}
System.out.println();
for (int v = 0; v < PET_INDEX.length; v++) {
System.out.print(PET[PET_INDEX[v]] + "\t\t");
}
System.out.println();
}
}
}
}
}
}
//1、英国人住红色房子
private static boolean checkCondition1() {
for (int i = 0; i < COUNTRY_INDEX.length; i++) {
for (int j = 0; j < ROOM_INDEX.length; j++) {
if (COUNTRY[COUNTRY_INDEX[i]].equals("英国") && ROOM[ROOM_INDEX[j]].equals("红色")
&& i == j) {
return true;
}
}
}
return false;
}
//2、瑞典人养狗
private static boolean checkCondition2() {
for (int i = 0; i < COUNTRY_INDEX.length; i++) {
for (int j = 0; j < PET_INDEX.length; j++) {
if (COUNTRY[COUNTRY_INDEX[i]].equals("瑞典") && PET[PET_INDEX[j]].equals("狗")
&& i == j) {
return true;
}
}
}
return false;
}
//3、丹麦人喝茶
private static boolean checkCondition3() {
for (int i = 0; i < COUNTRY_INDEX.length; i++) {
for (int j = 0; j < DRINK_INDEX.length; j++) {
if (COUNTRY[COUNTRY_INDEX[i]].equals("丹麦") && DRINK[DRINK_INDEX[j]].equals("茶")
&& i == j) {
return true;
}
}
}
return false;
}
//4、绿色房子在白色房子左面
private static boolean checkCondition4() {
for (int i = 0; i < ROOM_INDEX.length; i++) {
for (int j = 0; j < ROOM_INDEX.length; j++) {
if (ROOM[ROOM_INDEX[i]].equals("绿色") && ROOM[ROOM_INDEX[j]].equals("白色") && i < j) {
return true;
}
}
}
return false;
}
//5、绿色房子主人喝咖啡
private static boolean checkCondition5() {
for (int i = 0; i < ROOM_INDEX.length; i++) {
for (int j = 0; j < DRINK_INDEX.length; j++) {
if (ROOM[ROOM_INDEX[i]].equals("绿色") && DRINK[DRINK_INDEX[j]].equals("咖啡")
&& i == j) {
return true;
}
}
}
return false;
}
//6、抽PallMall香烟的人养鸟
private static boolean checkCondition6() {
for (int i = 0; i < SMOKE_INDEX.length; i++) {
for (int j = 0; j < PET_INDEX.length; j++) {
if (SMOKE[SMOKE_INDEX[i]].equals("PALLMALL") && PET[PET_INDEX[j]].equals("鸟")
&& i == j) {
return true;
}
}
}
return false;
}
//7、黄色房子主人抽Dunhill香烟
private static boolean checkCondition7() {
for (int i = 0; i < ROOM_INDEX.length; i++) {
for (int j = 0; j < SMOKE_INDEX.length; j++) {
if (ROOM[ROOM_INDEX[i]].equals("黄色") && SMOKE[SMOKE_INDEX[j]].equals("DUNHILL")
&& i == j) {
return true;
}
}
}
return false;
}
//8、住在中间房子的人喝牛奶
private static boolean checkCondition8() {
if (DRINK[DRINK_INDEX[2]].equals("牛奶")) {
return true;
}
return false;
}
//9、挪威人住第一间房
private static boolean checkCondition9() {
if (COUNTRY[COUNTRY_INDEX[0]].equals("挪威")) {
return true;
}
return false;
}
//10、抽Blends香烟的人住在养猫的人隔壁
private static boolean checkCondition10() {
for (int i = 0; i < SMOKE_INDEX.length; i++) {
for (int j = 0; j < PET_INDEX.length; j++) {
if (SMOKE[SMOKE_INDEX[i]].equals("BLENDS") && PET[PET_INDEX[j]].equals("猫")
&& (j - i == 1 || j - i == -1)) {
return true;
}
}
}
return false;
}
//11、养马的人住在抽Dunhill香烟的人隔壁
private static boolean checkCondition11() {
for (int i = 0; i < PET_INDEX.length; i++) {
for (int j = 0; j < SMOKE_INDEX.length; j++) {
if (PET[PET_INDEX[i]].equals("马") && SMOKE[SMOKE_INDEX[j]].equals("DUNHILL")
&& (j - i == 1 || j - i == -1)) {
return true;
}
}
}
return false;
}
//12、抽BlueMaster的人喝啤酒
private static boolean checkCondition12() {
for (int i = 0; i < SMOKE_INDEX.length; i++) {
for (int j = 0; j < DRINK_INDEX.length; j++) {
if (SMOKE[SMOKE_INDEX[i]].equals("BLUEMASTER")
&& DRINK[DRINK_INDEX[j]].equals("啤酒") && i == j) {
return true;
}
}
}
return false;
}
//13、德国人抽Prince香烟
private static boolean checkCondition13() {
for (int i = 0; i < COUNTRY_INDEX.length; i++) {
for (int j = 0; j < SMOKE_INDEX.length; j++) {
if (COUNTRY[COUNTRY_INDEX[i]].equals("德国")
&& SMOKE[SMOKE_INDEX[j]].equals("PRINCE") && i == j) {
return true;
}
}
}
return false;
}
//14、挪威人住蓝色房子隔壁
private static boolean checkCondition14() {
for (int i = 0; i < COUNTRY_INDEX.length; i++) {
for (int j = 0; j < ROOM_INDEX.length; j++) {
if (COUNTRY[COUNTRY_INDEX[i]].equals("挪威") && ROOM[ROOM_INDEX[j]].equals("蓝色")
&& (j - i == 1 || j - i == -1)) {
return true;
}
}
}
return false;
}
//15、抽Blends香烟的人有一个喝水的邻居
private static boolean checkCondition15() {
for (int i = 0; i < SMOKE_INDEX.length; i++) {
for (int j = 0; j < DRINK_INDEX.length; j++) {
if (SMOKE[SMOKE_INDEX[i]].equals("BLENDS") && DRINK[DRINK_INDEX[j]].equals("水")
&& (i - j == 1 || i - j == -1)) {
return true;
}
}
}
return false;
}
// public static void main(String[] args) {
// int[] indexArray = { 0, 1, 2, 3, 4 };
//
// do {
// System.out.print("{");
// for (int i = 0; i < 5; i++) {
// System.out.print(indexArray[i]);
// if (i != 4) {
// System.out.print(",");
// }
// }
// System.out.print("},");
// System.out.println();
// } while (nextPermutation(indexArray));
// }
//
// private static boolean nextPermutation(int[] arr) {
// int postLeft = -1;
// for (int i = arr.length - 1; i > 0; i--) {
// if (arr[i - 1] < arr[i]) {
// postLeft = i - 1;
// break;
// }
// }
// if (postLeft < 0) {
// return false;
// }
//
// int postRight = -1;
// for (int i = arr.length - 1; i >= postLeft; i--) {
// if (arr[i] > arr[postLeft]) {
// postRight = i;
// break;
// }
// }
// swap(arr, postLeft, postRight);
// reverse(arr, postLeft + 1, arr.length);
// return true;
// }
//
// private static void swap(int[] arr, int ind1, int ind2) {
// int t = arr[ind1];
// arr[ind1] = arr[ind2];
// arr[ind2] = t;
// }
//
// private static void reverse(int[] arr, int ind1, int ind2) {
// for (int i = 0; i < (ind2 - ind1) / 2; i++) {
// swap(arr, ind1 + i, ind2 - 1 - (i));
// }
// }
}
--------------1---------------
挪威 丹麦 英国 德国 瑞典
黄色 蓝色 红色 绿色 白色
水 茶 牛奶 咖啡 啤酒
DUNHILL BLENDS PALLMALL PRINCE BLUEMASTER
猫 马 鸟 鱼 狗
--------------2---------------
挪威 德国 英国 丹麦 瑞典
绿色 蓝色 红色 黄色 白色
咖啡 水 牛奶 茶 啤酒
PALLMALL PRINCE BLENDS DUNHILL BLUEMASTER
鸟 猫 马 鱼 狗
--------------3---------------
挪威 德国 英国 丹麦 瑞典
绿色 蓝色 红色 黄色 白色
咖啡 水 牛奶 茶 啤酒
PALLMALL PRINCE BLENDS DUNHILL BLUEMASTER
鸟 鱼 马 猫 狗
--------------4---------------
挪威 德国 瑞典 丹麦 英国
绿色 蓝色 白色 黄色 红色
咖啡 水 牛奶 茶 啤酒
PALLMALL PRINCE BLENDS DUNHILL BLUEMASTER
鸟 猫 狗 鱼 马
--------------5---------------
挪威 德国 瑞典 丹麦 英国
绿色 蓝色 白色 黄色 红色
咖啡 水 牛奶 茶 啤酒
PALLMALL PRINCE BLENDS DUNHILL BLUEMASTER
鸟 鱼 狗 猫 马
--------------6---------------
挪威 德国 瑞典 英国 丹麦
绿色 蓝色 白色 红色 黄色
咖啡 水 牛奶 啤酒 茶
PALLMALL PRINCE BLENDS BLUEMASTER DUNHILL
鸟 猫 狗 马 鱼
--------------7---------------
挪威 德国 瑞典 英国 丹麦
绿色 蓝色 黄色 红色 白色
咖啡 水 牛奶 啤酒 茶
BLENDS PRINCE DUNHILL BLUEMASTER PALLMALL
鱼 猫 狗 马 鸟
分享到:
相关推荐
《易语言 爱因斯坦的谁养鱼》是一份基于易语言编写的源代码文件,这个项目可能是一个趣味性的程序,旨在通过“谁养鱼”的问题来展示编程思维和算法设计。易语言是中国本土开发的一种面向初学者的编程语言,它的设计...
使用JAVA语言中的ArrayList解决爱因斯坦在20世纪初出的逻辑推理题——《谁养鱼》,在一条街上有5座房子,喷了5种颜色。每个房子里住着不同国籍的人。每个人喝不同的饮料,抽不同品牌的香烟,养不同的宠物。问谁养的...
爱因斯坦的困惑 1.有5栋5种颜色的房子 2.每一位房子的主人国籍都不同 3.这五个人每人只喝一个牌子的饮料,只抽一个牌子的香烟,只养一种宠物 4.没有人有相同的宠物...问题:谁养鱼? ---------------------
《谁养鱼》是一款基于易语言开发的游戏,易语言是一种以中文编程为特色的编程语言,旨在降低编程门槛,让更多人能够参与到程序设计中来。在本压缩包中,包含了一个名为"谁养鱼.e"的文件,这很可能是游戏的源代码文件...
自己用Wpf仿照Flash做得小游戏,Wpf做得界面真是让人惊叹,有兴趣可以下载看看,包括源码和可执行程序,程序中设计了自定义标题栏,以及对标题拖拉等处理,由于游戏比较简单,代码部分没有经过过多处理。...
爱因斯坦留下来的智力题目(谁养鱼?)据说世界上有98%的人答不出来 主题:爱因斯坦留下来的智力题目 1、在一条街上,有5座房子,喷了5种颜色。 2、每个房里住着不同国籍的人 3、每个人喝不同的饮料,抽...
oracle 数据库中经典谁养鱼sql,面试时貌似用的着。
尝试使用遗传算法解决谁养鱼问题,其实不太适合找最优解。_WhoseFish
自己用WPF仿FLASH小游戏做的,WPF设计的界面实在让人惊叹,有兴趣可以下载看看,包括源码和可执行程序,需要.NET3.0运行库以上支持,程序特点在于界面,代码部分没有刻意处理,包括对自定义标题栏的处理,开发工具:...
《谁养鱼问题的遗传算法Java实现解析》 在计算机科学和优化问题解决领域,遗传算法(Genetic Algorithms,简称GA)是一种模拟生物进化过程的搜索算法,它以自然选择、遗传、突变等机制为基础,寻找问题的最优解。在...
在一条街上,有5座房子,喷了5种颜色,每个颜色里的房子里住着不同国籍的人,每个人喝不同的饮料,抽不同的香烟,养不同的宠物,请问谁养鱼?(左图为打乱的排列)。 提示:。 英国人住红色房子。 瑞典人养狗。...
爱因斯坦难题C语言解法 1、 在一条街上,有5座房子,喷了5种颜色。 2、 每个房里住着不同国籍的人 3、 每个人喝不同的饮料,抽不同品牌的香烟,养不同的宠物 约束条件: 1、 英国人住红色房子 ...问题是:谁养鱼?
问题是:谁养鱼? 提示: 1、英国人住红色房子 2、瑞典人养狗 3、丹麦人喝茶 4、绿色房子在白色房子左面 5、绿色房子主人喝咖啡 6、抽Pall Mall 香烟的人养鸟 7黄色房子主人抽、Dunhill 香烟 8、住在中间...
原题为: 1.有5栋5种颜色的房子 2.每一位房子的主人国籍都不同 ... 问题:谁养鱼? 这道迷题出自1981年柏林的德国逻辑思考学院。 据说世界上只有2%的人能出答案。 就连大名鼎鼎的爱因斯坦也成为此题大伤脑筋。
* 问题是:谁养鱼? * * 1、英国人住红色房子 * 2、瑞典人养狗 * 3、丹麦人喝茶 * 4、绿色房子在白色房子左面 * 5、绿色房子主人喝咖啡 * 6、抽Pall Mall 香烟的人养鸟 * 7、黄色房子主人抽Dunhill ...
- **解析**:在这个例子中,我们需要根据给出的前提和提示,推断出谁养鱼。这不仅涉及到对每一个条件的理解,还要求我们能够将这些条件有机地结合在一起,形成一个连贯的逻辑链。例如,首先确定各个房屋的颜色和居住...
最终的问题是:“谁养鱼?”这个问题看似简单,但需要通过一系列逻辑推理来解答,涉及到排除法、交叉验证等技巧。 ### 2. 钱币与智慧 国王和钱庄主之间的故事展示了逻辑思维在实际问题中的应用。钱庄主面临的问题...
实例63 谁养鱼(运用ArrayList) 146 实例64 查看书目(运用Iterator) 153 实例65 操作元素(运用Vector) 155 实例66 栈和队列(运用LinkedList) 157 实例67 电视频道(运用集的相关类) 162 实例68 植物...