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
void printls(int s[5][5])
{
FILE *pout;
int i,j;
pout=fopen("res.txt","w+");
for(i=0;i<5;i++)
{
for(j=0;j<5;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;i<5;i++){if(s[i][0]==0)break;}
if(s[i][1]!=0)return 0;
//2
for(i=0;i<5;i++){if(s[i][1]==4)break;}
if(s[i][4]!=2)return 0;
//3
for(i=0;i<5;i++){if(s[i][1]==3)break;}
if(s[i][2]!=2)return 0;
//4
for(i=0;i<5;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;i<5;i++){if(s[i][3]==2)break;}
if(s[i][4]!=1)return 0;
//7
for(i=0;i<5;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;i<5;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;i<5;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;i<5;i++){if(s[i][3]==1)break;}
if(s[i][2]!=0)return 0;
//13
for(i=0;i<5;i++){if(s[i][1]==2)break;}
if(s[i][3]!=4)return 0;
//14
for(i=0;i<5;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;i<5;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;j<5;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;i<120;i++)
{
for(j=0;j<120;j++)
{
for(k=0;k<120;k++)
{
for(l=0;l<120;l++)
{
for(m=0;m<120;m++)
{
for(n=0;n<5;n++)
{
s[n][0]=p[i][n];
}
for(n=0;n<5;n++)
{
s[n][1]=p[j][n];
}
for(n=0;n<5;n++)
{
s[n][2]=p[k][n];
}
for(n=0;n<5;n++)
{
s[n][3]=p[l][n];
}
for(n=0;n<5;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 狗
这次是程序穷举法验证,不知道楼主还有什么可说的。。。如果您真的找到第二种答案,把它的细节列表发出来,大家看一看啊
你的理解思考是:房子不是椅一字排开,而是首尾呼应!~
德国人住绿色的房子,喝咖啡,抽PRINCE的烟,养鱼
所以是德国人养鱼
答案:推理步骤简介:
1.挪威是1号房 牛奶是3号房
2.蓝是2号房
3.咖啡-绿是4号 白是5号房
4.英-红是3号房
5. 此时可以判定Dunhill-黄是1号,马是2号
6.假设丹-茶是5号房,则德-Prince是2号 blueMaster-啤酒就没有地方了,所以可以判定丹-茶是2号
7.则blueMaster-啤酒是5号
8.于是德-Prince是4号
9.于是Pall-鸟是3号
10. Blends是2号
11. 猫是1号
12. 矿泉水是1号
13. 瑞典-狗是5号
14. 最后那个德国人抽Prince喝咖啡 住绿房子 养鱼
我记得当时做出来的结果就1种 德国人 好像大部分网友也是这个答案
d