C#轻松解决世纪迷题

原创 2004年03月12日 11:56:00

作者:李志勇 发表于赛迪网。

e-mail: netsafe@sina.com

转载请注明出处。


下面的问题相信很多人都听过:
1 有五栋五种颜色的房子
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 、抽混合烟的人的邻居喝矿泉水

问题是: 谁养鱼?
这道迷题出自柏林的德国逻辑思考学院。据说世界上只有2%的人能出答案。就连大名鼎鼎的爱因斯坦也成为此题大伤脑筋,所以这道题也经常被国内外知名公司用做面试题目,相信许多朋友都只做出过一个答案,如果碰巧你属于那98%该怎么办呢。没关系,如果这个问题用电脑来解决就非常easy了。
程序代码如下:

  1. using System;
  2. namespace netsafe.math
  3. {
  4.  public class ayst
  5.  {
  6.   
  7.   /// <summary>
  8.   /// 问题中的所有元素
  9.   /// </summary>
  10.   string[,] data= {{"黄房子""蓝房子""白房子""红房子""绿房子"},
  11.        {"挪威人""英国人""德国人""丹麦人""瑞典人"},
  12.        {"DUNHILL""PRINCE""混合烟""PALL MALL""BLUE MASTER"},
  13.        {"咖 啡""矿泉水""茶""牛奶"" 啤酒 "},
  14.        {"鱼"" 恐龙""马""鸟""狗"}};
  15.   /// <summary>
  16.   /// answer用来存放答案
  17.   /// </summary>
  18.   int[,] answer=new int[6, 6];
  19.   int[,] ALL=new int[6,122];
  20.   int count=1;
  21.   int nLevel = 0;
  22.   int[] List=new int[6];
  23.   public static void Main(string[] args)
  24.   {
  25.    ayst c=new ayst();
  26.    c.p();  ///生成全排列到all
  27.    c.run();
  28.    Console.Read(); /// 按任意键继续
  29.   }
  30.   void run()
  31.   {
  32.    int i1,i2,i3,i4,i5;
  33.    ///通过逻辑条件顺序的有效选择来优化程序
  34.    for (i1=1;i1<=120;i1++)    ///房子
  35.    {
  36.     /// 9 、挪威人住第一间房子
  37.     /// 14 、挪威人住在蓝房子旁边
  38.     /// 不满足条件就短路
  39.     /// 
  40.     if (ALL[2,i1]!=2)continue;
  41.     for(int j=0;j<5;j++,answer[j,1]=ALL[j,i1]);
  42.     for (i2=1;i2<=120;i2++)   ///人种
  43.     {   
  44.   
  45.      for(int j=0;j<5;j++,answer[j,2]=ALL[j,i2]);
  46.      /// 9 、挪威人住第一间房子
  47.      if (ALL[1,i2]!=1)continue;
  48.      ///1、 英国人住在红房子里
  49.      ///
  50.      if (find(1,4)!=find(2,2))continue;
  51.      /// 4 、绿房子在白房子左边
  52.      /// 
  53.      if (find(1,5)>find(1,3))continue;
  54.      for (i3=1;i3<=120;i3++)     ///烟
  55.      {
  56.      
  57.       for(int j=0;j<5;j++,answer[j,3]=ALL[j,i3]);
  58.       ///  13、 德国人抽PRINCE烟
  59.       ///  
  60.       if(find(2,3)!=find(3,2))continue;
  61.       ///  7 、黄房子主人抽DUNHILL烟
  62.       ///  
  63.       if(find(1,1)!=find(3,1))continue;
  64.       for (i4=1;i4<=120;i4++)   ///饮料
  65.       { 
  66.        
  67.        for(int j=0;j<5;j++,answer[j,4]=ALL[j,i4]);
  68.        ///  8 、住在中间那间房子的人喝牛奶
  69.        ///  
  70.        if(ALL[3,i4]!=4)continue;
  71.        /// 5 、绿房子主人喝咖啡
  72.        /// 
  73.        if (find(1,5)!=find(4,1))continue;
  74.        ///  3 、丹麦人喝茶
  75.        ///  
  76.        if(find(2,4)!=find(4,3))continue;
  77.        ///  15 、抽混合烟的人的邻居喝矿泉水 
  78.         
  79.        if(Math.Abs(find(3,3)-find(4,2))!=1)continue;
  80.        ///  12 、抽BLUE MASTER烟的人喝啤酒
  81.        ///  
  82.        if(find(3,5)!=find(4,5))continue;
  83.        for (i5=1;i5<=120;i5++)   ///宠物
  84.        {     
  85.         
  86.         for(int j=0;j<5;j++,answer[j,5]=ALL[j,i5]);
  87.         /// 10 、抽混合烟的人住在养鱼人的旁边
  88.         /// 
  89.         if(Math.Abs(find(3,3)-find(5,1))!=1)continue;
  90.         ///  2 、瑞典人养了一条狗
  91.         ///  
  92.         if(find(2,5)!=find(5,5))continue;
  93.         ///  6 、抽PALL MALL烟的人养了一只鸟 
  94.         ///  
  95.         if(find(3,4)!=find(5,4))continue;
  96.         /// 11 、养马人住在DUNHILL烟的人旁边
  97.         /// 
  98.         if(Math.Abs(find(5,3)-find(3,1))!=1)continue;
  99.         ///
  100.         ///能活到这里的data,当然是答案喽
  101.         ///
  102.         write_answer();
  103.  
  104.        }
  105.  
  106.       }
  107.      }
  108.  
  109.     }
  110.    }
  111.   }
  112.          
  113.   /// <summary>
  114.   /// 非常典型的用递归实现排列组合算法。
  115.   /// </summary>
  116.   public void p()   
  117.   {
  118.    int nCount,nJudge,key;
  119.    nLevel++;
  120.    if(nLevel>5)
  121.    {
  122.     writeall();///有一种排列就写到All数组里
  123.     nLevel--;
  124.     return;
  125.    }
  126.    for(nCount=1;nCount<=5;nCount++)
  127.    {
  128.     key=0;
  129.     for(nJudge=0;nJudge<=nLevel-1;nJudge++)
  130.      if(nCount==List[nJudge])
  131.      {
  132.       key=1;
  133.       break;
  134.      }
  135.   
  136.     if(key==0)
  137.     {
  138.      List[nLevel]=nCount;
  139.      p();
  140.     }
  141.    }
  142.    nLevel--;
  143.   }
  144.   /// <summary>
  145.   /// 写入all数组
  146.   /// </summary>
  147.   void writeall()
  148.   {
  149.    int i;
  150.    for (i=1;i<=5;i++)
  151.    {
  152.     ALL[i,count]=List[i];
  153.    }  
  154.    count++;
  155.   }
  156.   int  find(int i,int j)
  157.   {
  158.    int k;
  159.    for(k=0;k<=5;k++)
  160.    {
  161.     if (answer[k,i]==j)
  162.     {
  163.      return k;
  164.     }
  165.    }
  166.    return -1;
  167.   }
  168.   /// <summary>
  169.   /// 将答案打印出来
  170.   /// </summary>
  171.   void write_answer()
  172.   {
  173.    
  174.    for (int i = 1;i<=5;i++)
  175.    {
  176.     for(int j=1 ;j<=5;j++)
  177.     {
  178.      Console.Write(data[i-1,answer[j,i]-1]+",");
  179.     }
  180.     Console.WriteLine();
  181.    }
  182.    Console.WriteLine();
  183.   }
  184.  }
  185. }

说明:程序使用C#,在Microsoft Visual  Studio.net下编译执行通过(在我的电脑上1秒种就可以出结果)。如果你没有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,
咖 啡,矿泉水,牛奶,茶, 啤酒 ,
鸟, 恐龙,马,鱼,狗,

C#轻松解决世纪迷题

作者:李志勇 发表于赛迪网。e-mail: netsafe@sina.com原文转载自:http://blog.csdn.net/hadelu/archive/2004/03/12/15936.asp...
  • pc2s
  • pc2s
  • 2004年08月13日 08:07
  • 924

世纪秒时间转换为日期时间字符串

C++中time(NULL)存库的时间为世纪秒时间,由于世纪秒时间我们还需要通过转换才能看到日期时间,这样很不方便,故在网上搜了一下这个转换的时间,为了以后自己能够随时用到,也为了加深自己的印象,就写...
  • lycx1234
  • lycx1234
  • 2015年03月26日 08:24
  • 1005

C#新手学习快速成长学习资源汇总

目录 一:引言 二:.NET技术体系 三:常用工具汇总 四:学习资源汇总 五:书籍推荐 六:关于阅读技术书籍的经验 七:总结   一:引言 因为...
  • whChina
  • whChina
  • 2016年04月25日 11:35
  • 13749

日期时间转换为世纪秒

日期时间的不同写法,导致转换为世纪秒的方式不同,前一篇当时没想到更好的办法,便采用把字符串中的部分字符替换,然后再转换为世纪秒。 下面将两种不同的日期形式转换为世纪秒。 1. 日期形式为:yyyy/M...
  • lycx1234
  • lycx1234
  • 2016年03月24日 19:37
  • 1499

怎样推算是哪个世纪,哪个年代?

      一百年是一个世纪,每十年为一个年代。     “世纪”一词,来源于拉丁文,意思是100年,也是从耶稣诞生那一年算起。一个世纪一百年,应从第一年算起。公元元年至100年为一世纪,101年到2...
  • Sandwi
  • Sandwi
  • 2007年04月25日 14:45
  • 2431

十部20世纪经典电影推荐

十部20世纪经典电影推荐16340097 数据科学与计算机学院目录 引言 10.《喜剧之王》 9.《拯救大兵瑞恩》 8.《搏击俱乐部》 7.《七宗罪》 6.《这个杀手...
  • jhf666
  • jhf666
  • 2016年10月10日 15:15
  • 718

跟我学做c#皮肤美化(七)----窗体换肤

这个系列好久都没有更新了,貌似上一篇还是在今年五月份发布的。呵呵,不感慨了,还是开始介绍今天的内容吧! 这里说明一下这次实现的换肤都是基于贴图换肤的,并不可以像QQ那样还可以调整色调甚至自定义图片为背...
  • cjcy1984001
  • cjcy1984001
  • 2010年11月16日 09:03
  • 873

准备!21世纪--人工智能的天下

   昨天看了csdn上的 关于机器人的介绍,心里不由得为之一震.新时代又要到来了!  很早以前(大约刚刚懂事)最喜欢的动画片要属变形金刚了.从那时侯起,对于机器人的喜爱就深深的落在心里.终于这一天到...
  • nebuladreamqw
  • nebuladreamqw
  • 2007年01月31日 01:10
  • 671

迷题

Sample Input TRGSJ XDOKI M VLN WPABE UQHCF ARRBBL0 ABCDE FGHIJ KLMNO P...
  • qq_30796379
  • qq_30796379
  • 2017年10月30日 13:37
  • 82

WU谜题

WU谜题(集异璧之大成)
  • nameofcsdn
  • nameofcsdn
  • 2016年10月29日 13:51
  • 2102
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#轻松解决世纪迷题
举报原因:
原因补充:

(最多只允许输入30个字)