日期:2014-05-19  浏览次数:20812 次

爱因斯坦的智力题
爱因斯坦出了一道题,他说世界上有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[