首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

爱因斯坦的智力题解决方法

2012-02-03 
爱因斯坦的智力题爱因斯坦出了一道题,他说世界上有90%的人回答不出,看看你是否属于10%。  内容:  1.有5栋5

爱因斯坦的智力题
爱因斯坦出了一道题,他说世界上有90%的人回答不出,看看你是否属于10%。

  内容:  
  1.   有5栋5种颜色的房子  
  2.   每一位房子的主人国籍都不同  
  3.   这五个人每人只喝一个牌子的饮料,只抽一个牌子的香烟,只养一种宠物  
  4.   没有人有相同的宠物,抽相同牌子的烟,喝相同牌子的饮料  
  已知条件:  
  1.   英国人住在红房子里  
  2.   瑞典人养了一条狗  
  3.   丹麦人喝茶  
  4.   绿房子在白房子的左边  
  5.   绿房子主人喝咖啡  
  6.   抽PALL   MALL   烟的人养了一只鸟  
  7.   黄房子主人抽DUNHILL烟  
  8.   住在中间房子的人喝牛奶  
  9.   挪威人住在第一间房子  
  10.   抽混合烟的人住在养猫人的旁边  
  11.   养马人住在抽DUNHILL烟人的旁边  
  12.   抽BLUE   MASTER烟的人喝啤酒  
  13.   德国人抽PRINCE烟  
  14.   挪威人住在蓝房子旁边  
  15.   抽混合烟的人的邻居喝矿泉水  
  问题:谁养鱼?

偶花了20分钟终于做出来了。

[解决办法]
Paste一下。
  程序代码如下:
  using System;
  namespace netsafe.math
  {
  public class ayst
   {
   ///
   /// 问题中的所有元素
   ///
   string[,] data= {{ "黄房子 ", "蓝房子 ", "白房子 ", "红房子 ", "绿房子 "},
      { "挪威人 ", "英国人 ", "德国人 ", "丹麦人 ", "瑞典人 "},
      { "DUNHILL ", "PRINCE ", "混合烟 ", "PALL MALL ", "BLUE MASTER "},
      { "咖 啡 ", "矿泉水 ", "茶 ", "牛奶 ", " 啤酒 "},
      { "鱼 ", " 恐龙 ", "马 ", "鸟 ", "狗 "}};
  
   ///
   /// answer用来存放答案
   ///
   int[,] answer=new int[6, 6];
  int[,] ALL=new int[6,122];
   int count=1;
   int nLevel = 0;
   int[] List=new int[6];
   public static void Main(string[] args)
   {
    ayst c=new ayst();
    c.p(); ///生成全排列到all
    c.run();
    Console.Read(); /// 按任意键继续
  }
   void run()
   {
    int i1,i2,i3,i4,i5;
    ///通过逻辑条件顺序的有效选择来优化程序
    for (i1=1;i1 <=120;i1++)  ///房子
    {
    /// 9 、挪威人住第一间房子
    /// 14 、挪威人住在蓝房子旁边
    /// 不满足条件就短路
    ///
  if (ALL[2,i1]!=2)continue;
    for(int j=0;j <5;j++,answer[j,1]=ALL[j,i1]);
    for (i2=1;i2 <=120;i2++)  ///人种
    { 
     for(int j=0;j <5;j++,answer[j,2]=ALL[j,i2]);
     /// 9 、挪威人住第一间房子
     if (ALL[1,i2]!=1)continue;
     ///1、 英国人住在红房子里
     ///
     if (find(1,4)!=find(2,2))continue;
  /// 4 、绿房子在白房子左边
     ///
     if (find(1,5)> find(1,3))continue;
     for (i3=1;i3 <=120;i3++)   ///烟
     {
    
     for(int j=0;j <5;j++,answer[j,3]=ALL[j,i3]);
     /// 13、 德国人抽PRINCE烟
     /// 
     if(find(2,3)!=find(3,2))continue;
     /// 7 、黄房子主人抽DUNHILL烟
     /// 
     if(find(1,1)!=find(3,1))continue;
     for (i4=1;i4 <=120;i4++)  ///饮料
     {
     
      for(int j=0;j <5;j++,answer[j,4]=ALL[j,i4]);
      /// 8 、住在中间那间房子的人喝牛奶
      /// 
      if(ALL[3,i4]!=4)continue;
  /// 5 、绿房子主人喝咖啡
      ///
      if (find(1,5)!=find(4,1))continue;
  /// 3 、丹麦人喝茶
      /// 
      if(find(2,4)!=find(4,3))continue;
  /// 15 、抽混合烟的人的邻居喝矿泉水
      
      if(Math.Abs(find(3,3)-find(4,2))!=1)continue;
      /// 12 、抽BLUE MASTER烟的人喝啤酒
      ///
  if(find(3,5)!=find(4,5))continue;
  for (i5=1;i5 <=120;i5++)  ///宠物
      {  
      
      for(int j=0;j <5;j++,answer[j,5]=ALL[j,i5]);
      /// 10 、抽混合烟的人住在养鱼人的旁边
      ///


      if(Math.Abs(find(3,3)-find(5,1))!=1)continue;
  /// 2 、瑞典人养了一条狗
      /// 
      if(find(2,5)!=find(5,5))continue;
      /// 6 、抽PALL MALL烟的人养了一只鸟
      /// 
      if(find(3,4)!=find(5,4))continue;
      /// 11 、养马人住在DUNHILL烟的人旁边
      ///
  if(Math.Abs(find(5,3)-find(3,1))!=1)continue;
      ///
      ///能活到这里的data,当然是答案喽
      ///
      write_answer();
  
      }
  
     }
     }
  
    }
    }
   }
  ///
   /// 非常典型的用递归实现排列组合算法。
   ///
   public void p()  
   {
    int nCount,nJudge,key;
    nLevel++;
    if(nLevel> 5)
    {
    writeall();///有一种排列就写到All数组里
    nLevel--;
    return;
    }
  for(nCount=1;nCount <=5;nCount++)
    {
    key=0;
    for(nJudge=0;nJudge <=nLevel-1;nJudge++)
     if(nCount==List[nJudge])
     {
     key=1;
     break;
     }
   
    if(key==0)
    {
     List[nLevel]=nCount;
     p();
    }
    }
    nLevel--;
   }
  ///
   /// 写入all数组
   ///
  void writeall()
   {
    int i;
    for (i=1;i <=5;i++)
    {
    ALL[i,count]=List[i];
    } 
    count++;
   }
  int find(int i,int j)
   {
  int k;
    for(k=0;k <=5;k++)
    {
    if (answer[k,i]==j)
    {
     return k;
    }
    }
    return -1;
   }
  ///
   /// 将答案打印出来
   ///
   void write_answer()
   {
   
    for (int i = 1;i <=5;i++)
    {
    for(int j=1 ;j <=5;j++)
    {
     Console.Write(data[i-1,answer[j,i]-1]+ ", ");
  }
    Console.WriteLine();
    }
    Console.WriteLine();
   }
   }
  }
  说明:程序使用C#,在Microsoft Visual Studio.net下编译执行通过。如果你没有Microsoft Visual C# 需要安装Microsoft(r) .NET Framework SDK ,把上述代码保存到ayst.cs,然后在命令行模式下执行csc ayst.cs ,然后执行ayst.exe也可以。这个程序是很久之前写的。当时只是为了得到答案,所以程序写的比较乱。让同行见笑了。以下是程序的运行结果(答案一总7种,没想到吧):
  黄房子,蓝房子,红房子,绿房子,白房子,
  挪威人,丹麦人,英国人,德国人,瑞典人,
  DUNHILL,混合烟,PALL MALL,PRINCE,BLUE  MASTER,
  矿泉水,茶,牛奶,咖 啡, 啤酒 ,
  鱼,马,鸟, 恐龙,狗,
  绿房子,蓝房子,黄房子,红房子,白房子,
  挪威人,德国人,瑞典人,英国人,丹麦人,
  混合烟,PRINCE,DUNHILL,BLUE   MASTER,PALL MALL,
  咖 啡,矿泉水,牛奶, 啤酒 ,茶,
   恐龙,鱼,狗,马,鸟,
  绿房子,蓝房子,白房子,黄房子,红房子,
  挪威人,德国人,瑞典人,丹麦人,英国人,
  PALL MALL,PRINCE,混合烟,DUNHILL,BLUE  MASTER,
  咖 啡,矿泉水,牛奶,茶, 啤酒 ,
  鸟,鱼,狗, 恐龙,马,
  绿房子,蓝房子,白房子,黄房子,红房子,
  挪威人,德国人,瑞典人,丹麦人,英国人,
  PALL MALL,PRINCE,混合烟,DUNHILL,BLUE  MASTER,
  咖 啡,矿泉水,牛奶,茶, 啤酒 ,
  鸟, 恐龙,狗,鱼,马,
  绿房子,蓝房子,白房子,红房子,黄房子,
  挪威人,德国人,瑞典人,英国人,丹麦人,
  PALL MALL,PRINCE,混合烟,BLUE  MASTER,DUNHILL,
  咖 啡,矿泉水,牛奶, 啤酒 ,茶,
  鸟,鱼,狗,马, 恐龙,
  绿房子,蓝房子,红房子,黄房子,白房子,
  挪威人,德国人,英国人,丹麦人,瑞典人,
  PALL MALL,PRINCE,混合烟,DUNHILL,BLUE  MASTER,
  咖 啡,矿泉水,牛奶,茶, 啤酒 ,
  鸟,鱼,马, 恐龙,狗,
  绿房子,蓝房子,红房子,黄房子,白房子,
  挪威人,德国人,英国人,丹麦人,瑞典人,
  PALL MALL,PRINCE,混合烟,DUNHILL,BLUE  MASTER,
  咖 啡,矿泉水,牛奶,茶, 啤酒 ,
  鸟, 恐龙,马,

[解决办法]
说了是paste的,N前年做过,德国人养鱼。
[解决办法]
对,德国人养鱼 :)

[解决办法]
画个表格,半小时一般就能出来。
[解决办法]
顶,学习啊,我觉得做一名合格的程序员,刚靠纸上谈兵没有用的.来各用代码出来,那才叫牛呢??所以我支持SassyBoy(好好接分,努力升角。)
支持下先,呵呵
------解决方案--------------------


当初偶花了接近一个小时, 惭愧..hehe
[解决办法]
大家给Albert Einstein 打个电话就晓得答案了;
TEL:+1-800-110-120-119
[解决办法]
德国人养鱼!
[解决办法]
这个问题时上一期程序员上面的题目
[解决办法]
挪威 丹麦 英国 德国 瑞典
---------------------------------
黄 蓝 红 绿 白
---------------------------------
矿泉水 茶 牛奶 咖啡 啤酒
---------------------------------
dun 混和 pall pri blue
---------------------------------
猫 马 鸟 鱼 狗

哈哈哈 楼主帮看看 和正确答案一样不:) 刚算算 挺有意思的 顶!~!
[解决办法]
俺也做出来
花了大概半小时
绿色+咖啡+德国+prince
[解决办法]
用Excel做比较容易
[解决办法]
德国人养鱼 还用程序编出来不成?????不是吧!!!逻辑推理出来也行吧!!!
[解决办法]
第一间房:挪威人/DUNHILL/矿泉水/黄房子/猫
第二间房:丹麦人/混合烟/茶/蓝房子/马
第三间房:英国人/PALL MALL/牛奶/红房子/鸟
第四间房:德国人/PRINCE/咖啡/绿房子/鱼
第五间房:瑞典人/BLUE MASTER/啤酒/白房子/狗

热点排行