本文目录一览:
- 1、爱因斯坦的2%人做得出那题目有几种答案!?
- 2、爱因斯坦智商测试,请用C语言编程解决问题。
- 3、爱因斯坦出了一道题,他说世界上有90%的人回答不出,看看你是否属于10%。
- 4、c语言爱因斯坦 谁养鱼
- 5、如何用语言解决这个问题
爱因斯坦的2%人做得出那题目有几种答案!?
2%?开玩笑。。。
详尽的推导如下
首先,利用房子突破
根据9,挪威人住第一间,
14挪威人旁边是蓝色房子,得到,蓝色房子是第二间
再根据4绿色在白色房子左边,绿色和白色都不可能是第一间。
根据1,英国人是红色,则红色也不是第一间。那么只剩下黄色是第一间。
再根据4绿色在白色左边,那么中间的房间只可能是绿色和红色中的一个,
但是5绿色喝咖啡,8中间喝牛奶,证明中间不是绿色,那就必然是红色咯,
好,至此,房子顺序确定,为黄,蓝,红,绿白
而且我们知道,第一间是挪威人,抽Dunhill(7),第二间的人养马(11),第三间是英国人,喝牛奶,第四间的人喝咖啡(5)。
至此还能对我们有帮助的条件就只剩下
2 3 6 10 12 13 15
好,根据3丹麦人喝茶,丹麦人必然只能是2号或者5号(因为1是挪威人,3,4喝的都不是茶)
根据12抽Blue Master的人喝啤酒,他必然只能是2号或者5号(1号抽Dunhill,34喝的不是啤酒)
那么,2号和5号必然一个喝啤酒一个和茶,剩下的喝水,就只能是1号了。
根据15,可知2号抽Blends烟,那么喝啤酒抽BM烟(条件12描述)的人只能是5号了
那么丹麦人喝茶,抽Blends,养马,住第二间蓝色,确定。
好,至此,饮料的问题解决了
再根据13,德国人抽Prince,只能是4号,因为125号的烟已经知道了,而三号是英国人。所以最后剩下的5号就是瑞典人,国籍解决,剩下的3号抽Pall Mall,烟草解决
由6,pall Mall养鸟,则3号浮出水面,中间房子,红色,英国人,养鸟,喝奶,抽Pall Mall
再根据2, 5号人物确定,最后一间房,白色,瑞典人,啤酒,养狗,抽Blue Master。
再根据10,明显2号隔壁养猫,而三号不养猫,则1号养猫,1号,黄色,挪威人,喝水,养猫,抽Dunhill。最后剩下的就是4号,德国人,绿色房子,喝咖啡,抽Prince,养鱼。
以上推导,步步严密,不存在第二种可能,所以答案唯一,就是德国人,不存在第二种可能。
本题只有一个答案,lz的丹麦肯定错了
使用计算机穷举法解决这个题目。刚刚经过6610秒的程序运行,完成了穷举。事实是,根据穷举法的结果,在所有120*120*120*120*120种可能(每一项都是5种的全排列)里面,只有一种可能满足题目要求。根本找不到第二种答案。强烈要求楼主将自己的丹麦的答案细节发出!
源程序:(C语言)
#include stdio.h
void printls(int s[5][5])
{
FILE *pout;
int i,j;
pout=fopen("res.txt","w+");
for(i=0;i5;i++)
{
for(j=0;j5;j++)
{
printf("%d ",s[i][j]);
fprintf(pout,"%d ",s[i][j]);
}
printf("\n");
fprintf(pout,"\n");
}
fclose(pout);
}
int check(int s[5][5])
{
int i,j;
//1
for(i=0;i5;i++){if(s[i][0]==0)break;}
if(s[i][1]!=0)return 0;
//2
for(i=0;i5;i++){if(s[i][1]==4)break;}
if(s[i][4]!=2)return 0;
//3
for(i=0;i5;i++){if(s[i][1]==3)break;}
if(s[i][2]!=2)return 0;
//4
for(i=0;i5;i++){if(s[i][0]==3)break;}
if(i==4)return 0;
if(s[i+1][0]!=2)return 0;
//5
if(s[i][2]!=4)return 0;
//6
for(i=0;i5;i++){if(s[i][3]==2)break;}
if(s[i][4]!=1)return 0;
//7
for(i=0;i5;i++){if(s[i][0]==1)break;}
if(s[i][3]!=3)return 0;
//8
if(s[2][2]!=1)return 0;
//9
if(s[0][1]!=1)return 0;
//10
for(i=0;i5;i++){if(s[i][3]==0)break;}
if(i==0){if(s[1][4]!=3)return 0;}
else if(i==4){if(s[3][4]!=3)return 0;}
else {if((s[i+1][4]!=3)(s[i-1][4]!=3))return 0;}
//11
for(i=0;i5;i++){if(s[i][4]==0)break;}
if(i==0){if(s[1][3]!=3)return 0;}
else if(i==4){if(s[3][3]!=3)return 0;}
else {if((s[i+1][3]!=3)(s[i-1][3]!=3))return 0;}
//12
for(i=0;i5;i++){if(s[i][3]==1)break;}
if(s[i][2]!=0)return 0;
//13
for(i=0;i5;i++){if(s[i][1]==2)break;}
if(s[i][3]!=4)return 0;
//14
for(i=0;i5;i++){if(s[i][1]==1)break;}
if(i==0){if(s[1][0]!=4)return 0;}
else if(i==4){if(s[3][0]!=4)return 0;}
else {if((s[i+1][0]!=4)(s[i-1][0]!=4))return 0;}
//15
for(i=0;i5;i++){if(s[i][3]==0)break;}
if(i==0){if(s[1][2]!=3)return 0;}
else if(i==4){if(s[3][2]!=3)return 0;}
else {if((s[i+1][2]!=3)(s[i-1][2]!=3))return 0;}
//if right
printls(s);
printf("\n");
return 1;
}
int main()
{
int s[5][5],i,j,k,l,m,n,p[121][5],o;
o = 0;
i = 0;
for(p[i][0]=0;p[i][0]5;p[i][0]++)
{
for(p[i][1]=0;p[i][1]5;p[i][1]++)
{
for(p[i][2]=0;p[i][2]5;p[i][2]++)
{
for(p[i][3]=0;p[i][3]5;p[i][3]++)
{
for(p[i][4]=0;p[i][4]5;p[i][4]++)
{
if(p[i][0]==p[i][1])continue;
if(p[i][0]==p[i][2])continue;
if(p[i][0]==p[i][3])continue;
if(p[i][0]==p[i][4])continue;
if(p[i][1]==p[i][2])continue;
if(p[i][1]==p[i][3])continue;
if(p[i][1]==p[i][4])continue;
if(p[i][2]==p[i][3])continue;
if(p[i][2]==p[i][4])continue;
if(p[i][3]==p[i][4])continue;
printf("%d %d %d %d %d\n",p[i][0],p[i][1],p[i][2],p[i][3],p[i][4]);
i++;
printf("%d\n",i);
if(i==120)break;
for(j=0;j5;j++)p[i][j]=p[i-1][j];
}if(i==120)break;
}if(i==120)break;
}if(i==120)break;
}if(i==120)break;
}
printf("%d\n",i);
for(i=0;i120;i++)
{
for(j=0;j120;j++)
{
for(k=0;k120;k++)
{
for(l=0;l120;l++)
{
for(m=0;m120;m++)
{
for(n=0;n5;n++)
{
s[n][0]=p[i][n];
}
for(n=0;n5;n++)
{
s[n][1]=p[j][n];
}
for(n=0;n5;n++)
{
s[n][2]=p[k][n];
}
for(n=0;n5;n++)
{
s[n][3]=p[l][n];
}
for(n=0;n5;n++)
{
s[n][4]=p[m][n];
}
o+= check(s);
}
}
}
printf("%d %d %d\n",i,j,o);
}
}
printf("%d end\n",o);
return 0;
}
其中用到的代码列表:
0 1 2 3 4
红色 黄色 白色 绿色 蓝色 0
英国 挪威 德国 丹麦 瑞典 1
啤酒 牛奶 茶 水 咖啡 2
Blen Blue Pall Dunh Prin 3
马 鸟 狗 猫 鱼 4
就是说数组s[i][j]每个i代表一个位置,每个j代表一种事物,具体代表什么可以查上面这个表。例如s[2][3]=4就代表中间那所房子(s[i][j]的i=2,所以房子号是第三个,就是中间的)里面的人抽的烟(s[i][j]中j=3,就是对应上表中最后标3的那行)是prince(标3的那行标4的那列是prince),再例如s[1][0]=2就代表第二座房子是白色的。
程序运行结果:
1 end (代表o=1,就是只找到一个解)
return code 0
Execution time 6609.68 seconds
文件输出的结果:
1 1 3 3 3
4 3 2 0 0
0 0 1 2 1
3 2 4 4 4
2 4 0 1 2
按照上面的表格给出翻译为
第一所房子 黄色 挪威 水 Dunhill 猫
第二所房子 蓝色 丹麦 茶 Blends 马
第三所房子 红色 英国 牛奶 PallMall 鸟
第四所房子 绿色 德国 咖啡 Prince 鱼
第五所房子 白色 瑞典 啤酒 BlueMast 狗
这次是程序穷举法验证,不知道楼主还有什么可说的。。。如果您真的找到第二种答案,把它的细节列表发出来,大家看一看啊
爱因斯坦智商测试,请用C语言编程解决问题。
问:邻居这个问题出自爱因斯坦,据他说,98%的人都做不出来。
有一排五间房子,每一间房子的颜色都不同。在这些房子里住着五个不同国籍的人。每个人喂养了不同的动物,喜欢不同的饮料,抽不同的雪茄。
英国人住在红色房子里。
瑞典人养狗。
丹麦人喝茶。
绿色的房子在白色房子的左边。
绿色房子的主人喜欢喝咖啡。
抽“坡魔”牌雪茄的人养鸟。
黄色房子的主人抽“顿山”牌雪茄。
住在中间房子的人喝牛奶。
挪威人住在第一间房子。
抽“波兰斯”牌雪茄的人住在养猫的人旁边。
养马的人住在抽“顿山”牌雪茄的人旁边。
抽“蓝领”牌雪茄的人喝啤酒。
德国人抽“王子”牌雪茄。
挪威人住在蓝色房子旁边。
抽“波兰斯”牌雪茄的人有一个喝水的邻居。谁家养鱼?
你是那2%的人吗?
分析过程:
首先我们可以知道挪威人在1号房子 喝牛奶的人在3号房子
《挪威人住在蓝色房子旁边。》
1号挪威人旁边只有一个房子 所以2号房子是蓝色
《绿色的房子在白色房子的左边。
绿色房子的主人喜欢喝咖啡》
此问题可以让我们知道如果1号是绿那么2号就是白但是2号是蓝色
如果3号是绿色也不行 因为绿色房间的人喝咖啡 但3号喝牛奶
所以只有4号是绿色5号是白色就可以说得通了 (注意!就此地可以改所有的答案,这里没说绿色在白色的隔壁,这只是爱因斯坦的陷阱,其实有两种答案,我们假设是隔壁,这是一种)
《英国人住在红色房子里。》现在没颜色的只有1号和3号怎么知道谁是红色呢?很简单 就是看国籍1号是挪威人不是英国人 那3号
房子就是红色主人是英国人 1号是黄色房间
1 2 3 4 5
挪威人 英国
红色 蓝色 黄色 绿色 白色
牛奶 咖啡
就下来有一个明显的信息 就是《黄色房子的主人抽“顿山”牌雪茄。》
1号是红色房间那么他抽顿山 接下来有一个像《挪威人住在蓝色房子旁边。》的问题就是《养马的人住在抽“顿山”牌雪茄的人旁边》
这个也很简单 就是红色房间是1号 他只有一个邻居就是2号
所以2号养马
1 2 3 4 5
挪威人 英国
红色 蓝色 黄色 绿色 白色
牛奶 咖啡
马
顿山
接下来才到了爱因斯坦说过的《98%人做不出》的难度了
我们先把一个可以知道的信息找出来就是
丹麦人喝茶。
抽“波兰斯”牌雪茄的人有一个喝水的邻居。
抽“蓝领”牌雪茄的人喝啤酒
这三个问题中都有水 我们先看看它们每个都是几号房子的人要喝
丹麦人可能是2 4 5号房子 因为他喝茶所以可以排除4号 那丹麦就是2 5号房中的一个
1号不抽波兰斯 可以排除(排除他不是抽波兰斯 但它可能是喝水的)5号的邻居(4号)喝咖啡可以排除(4号)3号又喝牛奶所以喝水的人可能是1 2 5号房间中的一个
1号不抽蓝领可以排除 3号喝牛奶可以排除 4号喝咖啡可以排除所以喝啤酒的人可能是2 5号
1 5 2号可能喝水
2 5号可能喝茶
2 5号可能喝啤酒
这一点要注意了 喝水的只能是1号 因为大家想想 如果5号喝水2号喝茶 要是这样的话啤酒就谁喝呢?1号?不可能因为已经被排除了 如果2号喝水也一样 所以1号喝水
1 2 3 4 5
挪威人 英国
红色 蓝色 黄色 绿色 白色
水 牛奶 咖啡
马
顿山
接下来我们分析《抽“波兰斯”牌雪茄的人有一个喝水的邻居。》
1号喝水 那么他只有一个邻居 就是2号 所以2号抽波兰斯
1 2 3 4 5
挪威人 英国
红色 蓝色 黄色 绿色 白色
水 牛奶 咖啡
马
顿山 波兰斯
用同样的方法排除:
抽“蓝领”牌雪茄的人喝啤酒
德国人抽“王子”牌雪茄
抽“坡魔”牌雪茄的人养鸟。
首先我们看蓝领 1号抽烟喝水 那不是他 2号抽波兰斯 不是他
3号喝牛奶也不是 4号喝咖啡也一样 只有5号的人可以说得通
现在是德国人的 1号是挪威人抽顿山 不是 2号波兰斯 不是
3号是英国人 不是 5号抽蓝领也不是 所以只有4号说得通
《抽“坡魔”牌雪茄的人养鸟》现在这个不用分析了 因为只有3号要抽的烟还没找到所以只有他抽坡魔了 并且养鸟
1 2 3 4 5
挪威 英国 德国
红色 蓝色 黄色 绿色 白色
水 牛奶 咖啡 啤酒
马 鸟
顿山 波兰斯 坡魔 王子 蓝领
《抽“波兰斯”牌雪茄的人住在养猫的人旁边》
2号抽波兰斯 他又两个邻居 一个是1号一个是3号 3号养鸟 所以不是他 那只有1号了
《瑞典人养狗。》
1号养猫的挪威人不可能 2号养马 不是 3号英国人养鸟不是
4号德国人 也不是 就只有5号是瑞典人了 那2号是丹麦人喝茶
就剩下一个4号没养宠物了 那么他当然是养 鱼
1 2 3 4 5
挪威 丹麦 英国 德国 瑞典
红色 蓝色 黄色 绿色 白色
水 茶 牛奶 咖啡 啤酒
猫 马 鸟 鱼 狗
顿山 波兰斯 坡魔 王子 蓝领
楼主我发誓这是我亲手写的!!!!!! 求最佳!!!!!
爱因斯坦出了一道题,他说世界上有90%的人回答不出,看看你是否属于10%。
呵呵,很典型的一个计算机推理题,有类似的程序,看看这个对你有启发,这个是一个钓鱼的推断程序:
/** 这道迷题出自1981年柏林的德国逻辑思考学院
* 原题为:
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.抽混合烟的人的邻居喝矿泉水
问题:谁养鱼?
据说世界上只有2%的人能出答案。
就连大名鼎鼎的爱因斯坦也成为此题大伤脑筋。
*/
/*
* @author cds
*
* TODO To change the template for this generated type comment go to Window -
* Preferences - Java - Code Style - Code Templates
*/
public class WhoFeedsFish {
public static final int NATIONALITY_ENGLISH = 1;
public static final int NATIONALITY_SWIDISH = 2;
public static final int NATIONALITY_DAMARK = 3;
public static final int NATIONALITY_NORWAY = 4;
public static final int NATIONALITY_GERMAN = 5;
private int[] nationalities = { 1, 2, 3, 4, 5 };
public static final int COLOR_RED = 1;
public static final int COLOR_GREEN = 2;
public static final int COLOR_YELLOW = 3;
public static final int COLOR_WHITE = 4;
public static final int COLOR_BLUE = 5;
private int[] colors = { 1, 2, 3, 4, 5 };
public static final int PET_DOG = 1;
public static final int PET_BIRD = 2;
public static final int PET_CAT = 3;
public static final int PET_HORSE = 4;
public static final int PET_FISH = 5;
private int[] pets = { 1, 2, 3, 4, 5 };
public static final int DRINK_TEA = 1;
public static final int DRINK_COFFEE = 2;
public static final int DRINK_MILK = 3;
public static final int DRINK_BEER = 4;
public static final int DRINK_WATER = 5;
private int[] drinks = { 1, 2, 3, 4, 5 };
public static final int TOBACCO_PALLMALL = 1;
public static final int TOBACCO_DUNHILL = 2;
public static final int TOBACCO_BLUEMASTER = 3;
public static final int TOBACCO_PRINCE = 4;
public static final int TOBACCO_MIXED = 5;
private int[] tobaccoes = { 1, 2, 3, 4, 5 };
private int[][] key = { nationalities, colors, pets, drinks, tobaccoes };
private 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();
}
public void print(String item, int index) {
if (false) {
} else if ("nationality".equals(item)) {
switch (index) {
case 1:
System.out.print("英国人\t\t");
break;
case 2:
System.out.print("瑞典人\t\t");
break;
case 3:
System.out.print("丹麦人\t\t");
break;
case 4:
System.out.print("挪威人\t\t");
break;
case 5:
System.out.print("德国人\t\t");
break;
}
} else if ("color".equals(item)) {
switch (index) {
case 1:
System.out.print("红房子\t\t");
break;
case 2:
System.out.print("绿房子\t\t");
break;
case 3:
System.out.print("黄房子\t\t");
break;
case 4:
System.out.print("白房子\t\t");
break;
case 5:
System.out.print("蓝房子\t\t");
break;
}
} else if ("pet".equals(item)) {
switch (index) {
case 1:
System.out.print("狗\t\t");
break;
case 2:
System.out.print("鸟\t\t");
break;
case 3:
System.out.print("猫\t\t");
break;
case 4:
System.out.print("马\t\t");
break;
case 5:
System.out.print("鱼\t\t");
break;
}
} else if ("drink".equals(item)) {
switch (index) {
case 1:
System.out.print("茶\t\t");
break;
case 2:
System.out.print("咖啡\t\t");
break;
case 3:
System.out.print("牛奶\t\t");
break;
case 4:
System.out.print("啤酒\t\t");
break;
case 5:
System.out.print("水\t\t");
break;
}
} else if ("tobacco".equals(item)) {
switch (index) {
case 1:
System.out.print("PALLMALL\t\t");
break;
case 2:
System.out.print("DUNHILL\t\t");
break;
case 3:
System.out.print("BLUEMASTER\t\t");
break;
case 4:
System.out.print("PRINCE\t\t");
break;
case 5:
System.out.print("混合烟\t\t");
break;
}
}
}
private boolean check01() {
boolean ret = true;
// 条件1:英国人住在红房子里 01
for (int i = 0; i nationalities.length; i++) {
if (key[0][i] == NATIONALITY_ENGLISH) {
if (key[1][i] != COLOR_RED) {
ret = false;
}
break;
}
}
return ret;
}
private boolean check02() {
boolean ret = true;
// 条件2:瑞典人养了一条狗 02
for (int i = 0; i nationalities.length; i++) {
if (key[0][i] == NATIONALITY_SWIDISH) {
if (key[2][i] != PET_DOG) {
ret = false;
}
break;
}
}
return ret;
}
private boolean check1() {
boolean ret = true;
// 条件4:绿房子在白房子的左边 1
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) {
ret = false;
}
break;
}
}
}
}
return ret;
}
private boolean check3() {
// 条件8:住在中间房子的人喝牛奶 3
return key[3][2] == DRINK_MILK ? true : false;
}
// 条件9:挪威人住在第一间房子 0
private boolean check0() {
if (key[0][0] != NATIONALITY_NORWAY) {
return false;
}
return true;
}
private boolean check011() {
// 14.挪威人住在蓝房子旁边 01
boolean ret = false;
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 ret;
}
// /////////////////////////////////////////////////////////////////
private boolean check() {
boolean ret = true;
// 条件1:英国人住在红房子里 01
ret = check01();
if (ret == false)
return false;
// 条件2:瑞典人养了一条狗 02
ret = check02();
if (ret == false)
return false;
// 条件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;
}
}
}
// 条件4:绿房子在白房子的左边 1
ret = check1();
if (ret == false)
return false;
// 条件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;
}
}
}
// 条件8:住在中间房子的人喝牛奶 3
ret = check3();
if (ret == false)
return false;
// 条件9:挪威人住在第一间房子 0
ret = check0();
if (ret == false)
return false;
// 条件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;
}
}
}
}
// 条件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;
}
}
}
}
// 条件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;
}
}
}
// 14.挪威人住在蓝房子旁边 01
ret = check011();
if (ret == false)
return false;
// 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;
}
}
}
}
}
return ret;
}
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(!check()){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("==========Start==========");
wff.run();
System.out.println("==========End==========");
}
}
c语言爱因斯坦 谁养鱼
#includestdio.h
char*COL[]={NULL,"红","黄","绿","蓝","白"};
char*PAD[]={NULL,"狗","猫","鱼","鸟","马"};
char*DRK[]={NULL,"茶 ","牛奶","咖啡","啤酒","水 "};
char*GUO[]={NULL,"挪威","英国","德国","丹麦","瑞典"};
char*SMK[]={NULL,"Blends","BlueMaster","Dunhill","Pall Mall","Prince"};
struct{ char guojia, color, pads, drink, smoke; } aa[5];
int OK(void)
{
int i,j;
for(i=0;i5;i++)
if(aa[i].guojia==2 aa[i].color==1)goto next1;
return 0;
next1:
for(i=0;i5;i++)
if(aa[i].guojia==5 aa[i].pads==1)goto next2;
return 0;
next2:
for(i=0;i5;i++)
if(aa[i].guojia==4 aa[i].drink==1)goto next3;
return 0;
next3:
for(i=0;i5;i++)
if(aa[i].color==3)goto next3_1;
return 0;
next3_1:
for(j=i+1;j5;j++)
if(aa[j].color==5)goto next4;
return 0;
next4:
for(i=0;i5;i++)
if(aa[i].color==3 aa[i].drink==3)goto next5;
return 0;
next5:
for(i=0;i5;i++)
if(aa[i].smoke==4 aa[i].pads==4)goto next6;
return 0;
next6:
for(i=0;i5;i++)
if(aa[i].color==2 aa[i].smoke==3)goto next7;
return 0;
next7:
for(i=0;i5;i++)
if(aa[i].guojia==3 aa[i].smoke==5)goto next10;
return 0;
next10:
for(i=0;i5;i++)
if(aa[i].smoke==2 aa[i].drink==4)goto next11;
return 0;
next11:
for(i=0;i5;i++)
if(aa[i].smoke==3)goto next12_1;
next12_1:
if(i==0){if(aa[1].pads==5)goto next13;}
else if(i==4){if(aa[3].pads==5)goto next13;}
else if(aa[i-1].pads==5||aa[i+1].pads==5)goto next13;
return 0;
next13:
for(i=0;i5;i++)
if(aa[i].smoke==1)goto next13_1;
next13_1:
if(i==0){if(aa[1].pads==2)goto next14;}
else if(i==4){if(aa[3].pads==2)goto next14;}
else if(aa[i-1].pads==2||aa[i+1].pads==2)goto next14;
return 0;
next14:
for(i=0;i5;i++)
if(aa[i].smoke==1)goto next14_1;
next14_1:
if(i==0){if(aa[1].drink==5)goto next15;}
else if(i==4){if(aa[3].drink==5)goto next15;}
else if(aa[i-1].drink==5||aa[i+1].drink==5)goto next15;
return 0;
next15:
return 1;
}
char color[4]={1,2,3,5};
char drink[4]={1,3,4,5};
char guojia[4]={2,3,4,5};
char smoke[]={1,2,3,4,5};
char pads[5]={1,2,3,4,5};
int rot(char a[],int n)
{ int i,j,k,t;
for(k=n-1;k0;k--)
if(a[k-1]a[k])break;
if(k==0)
{ for(i=0,j=n-1;ij;i++,j--)
{char t=a[i];
a[i]=a[j];
a[j]=t;
}
return 0;
}
t=a[k-1];i=k;
for(j=k+1;jn;j++)
if(ta[j]a[j]a[i])i=j;
a[k-1]=a[i];a[i]=t;
for(i=k;in-1;i++)
for(j=k;jn-1+k-i;j++)
if(a[j]a[j+1])
{ t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
return 1;
}
int main()
{ int i,j,k,ans=0;
int i1,i2,i3,i4,i5;
aa[1].color=4;
aa[2].drink=2;
aa[0].guojia=1;
for(i1=0;i124;i1++){
aa[0].color=color[0];
aa[2].color=color[1];
aa[3].color=color[2];
aa[4].color=color[3];
rot(color,4);
for(i2=0;i224;i2++){
aa[0].drink=drink[0];
aa[1].drink=drink[1];
aa[3].drink=drink[2];
aa[4].drink=drink[3];
rot(drink,4);
for(i3=0;i324;i3++){
aa[1].guojia=guojia[0];
aa[2].guojia=guojia[1];
aa[3].guojia=guojia[2];
aa[4].guojia=guojia[3];
rot(guojia,4);
for(i4=0;i4120;i4++){
for(i=0;i5;i++)
aa[i].smoke=smoke[i];
rot(smoke,5);
for(i5=0;i5120;i5++){
for(j=0;j5;j++)
aa[j].pads=pads[j];
rot(pads,5);
if(OK()){
printf("---------------------第%d种解---------------------\n",++ans);
for(k=0;k5;k++)
printf("第%d户: %s人 %s房子 养%s 喝%s 抽%s\n",k+1,GUO[aa[k].guojia],
COL[aa[k].color],PAD[aa[k].pads],DRK[aa[k].drink],SMK[aa[k].smoke]);
}}}}}}
return 0;
}
如何用语言解决这个问题
1)位于最中间的屋主喝牛奶:可以得出第三间房子的主人喝的饮料是牛奶。
(2)挪威人住在第一间房屋里:可以得出第一间房子的主人国籍是挪威人。
(3)挪威人住在蓝色房子隔壁:可以得出第二间房子的主人房子的颜色是蓝色。
(4)绿色的房子在白色的房子的左边;绿色房屋的屋主喝咖啡:由于绿色房子和白色房子是连在一起的,所以现在可以选择的房子颜色是3、4、5号,绿色房子和白色房子在这三间房子里面;而绿色房子在白色房子的左边,因此,若3号是绿色,4号就是白色,若4号是绿色,5号是白色,由于绿色房子的屋主喝咖啡,因此,绿色房子不可能是3号,因此,4号是绿色,5号是白色;第四间房子的主人喝的饮料是咖啡。
(5)英国人住在红色房屋里:1号房子是挪威人,因此1号排除,2、4、5号房子均有颜色,因此,3号房子是红色的,国籍是英国人。
(6)黄色屋主抽Dunhill:剩余的1号房子的颜色是黄色,房主抽的是Dunhill。
(7)养马的屋主在抽Dunhill的人家的隔壁:抽Dunhill是1号,因此2号养马。
(8)抽Blue Master的屋主喝啤酒:现在饮料和香烟都没有确定的是2号和5号;假设:若5号是,5号房子主人和啤酒,抽Blue Master。
(9)在(8)假设成立的前提下,丹麦人喝茶:国籍和饮料都没有确定的只有2号,因此,2号房主的国籍是丹麦人,喝的是茶。
(10)在(8)假设成立的前提下,德国人抽Prince:国籍没有定的是4号和5号,而5号抽Blue Master,因此,4号房主是德国人,抽Prince。
(11)在(8)假设成立的前提下,瑞典人养了一只狗:只剩下5号,因此,5号房主国籍是瑞典人,养狗。
(12)在(8)假设成立的前提下,抽Pall Mall香烟的屋主养鸟:香烟和宠物都没有确定的只有3号,因此,3号房主抽Pall Mall,养鸟。
(13)在(8)假设成立的前提下,抽Blend的人住在养猫人家的隔壁:只剩下2号,因此,2号房主抽Blend,1号房主养猫。
(14)在(8)假设成立的前提下,只喝开水的人家住在抽Blend的隔壁:只剩下1号,1号房主喝的饮料是开水。
(15)最后剩一个就是养鱼。
(16)因此,(8)的假设成立。
最后得到结论 德国人养的鱼