爱因斯坦的2%人做得出那题目有几种答案!?

2025-04-24 23:36:15
推荐回答(5个)
回答1:

  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 狗

  这次是程序穷举法验证,不知道楼主还有什么可说的。。。如果您真的找到第二种答案,把它的细节列表发出来,大家看一看啊

回答2:

你的理解思考是:房子不是椅一字排开,而是首尾呼应!~

回答3:

德国人住绿色的房子,喝咖啡,抽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喝咖啡 住绿房子 养鱼

回答4:

我记得当时做出来的结果就1种 德国人 好像大部分网友也是这个答案

回答5:

d