商城 设为首页注册本站  论坛  繁體中文

慧民电脑芯片级维修-电脑技巧
手机 | MP3 | MP4 | 显卡 | 主板 | 显示器 | 光存储 | 笔记本 | 网络设备 | 移动存储 | 数码相机
键鼠 | CPU | 音箱 | GPS | 电视 | 服务器 | 投影机 | 机箱电源 | 品牌电脑 | 办公打印 |
| 网站首页 | Cisco | Windows | Linux | Java | Dotnet | Oracle | 网页设计 | 平面设计 | 安全 | 软件应用 | 电脑维修 | 办公维修 |
您现在的位置: 电脑技巧 >> Windows >> 系统故障 >> 系统故障 >> Windows正文

C#轻松解决世纪迷题:爱因斯坦算法

文章来源:CSDN.NET 作者:佚名 更新时间:2004-9-6 【 】 【加入收藏

  下面的问题相信很多人都听过:
  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 、抽混合烟的人的邻居喝矿泉水
  问题是: 谁养鱼?
  这道迷题出自1981年柏林的德国逻辑思考学院。据说世界上只有2%的人能出答案。就连大名鼎鼎的爱因斯坦也成为此题大伤脑筋,所以这道题也经常被国内外知名公司用做面试题目,相信许多朋友都只做出过一个答案,如果碰巧你属于那98%该怎么办呢。没关系,如果这个问题用电脑来解决就非常easy了。
  程序代码如下:
  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,
  咖 啡,矿泉水,牛奶,茶, 啤酒 ,
  鸟, 恐龙,马,
  • 上一篇Windows:

  • 下一篇Windows:
  • 最 新 热 门
     低配置电脑如何优化Vista系统运行如飞似XP
     安全修改注册表默认响应方式
     禁用Vista下的硬盘监控任务栏警告
     巧用GhostEXP 将补丁加入GHO文件
     windows运行中几个特殊的执行命令
     技巧:用MSDaRT解决Vista启动故障
     XP中一人远程管理关机好方法
     一次简单修改 让WinRAR解压缩速度更快
     彻底禁用暴风顽固进程 让系统清爽起来
     通吃主流格式 让系统图片查看器更完美
    最 新 推 荐
     “内存不能read”的解决方法
     解决LCD在Vista下的兼容故障
     几个常见的Vista系统优化故障解决方法
     杀毒之后Windows桌面不显示之谜
     系统提示“NTLDR is mising”怎么解决
     如何解决Vista分区报错故障
     Vista出现混合音问题的解决方法
     安装XP SP3后系统蓝屏的解决办法
     系统重装导致NTFS无法访问
     对 XP中出现故障服务进行故障排除
    相 关 文 章

    轻轻松松防毒 命令行下的抗毒精英
    仅需10MB资源 轻松将Vista特效搬进XP
    轻松把秘密密码藏到图片的后面
    在Vista中轻松揪出局域网中没被使用IP地址
    巧设搜索选项 轻松查找系统内隐藏文件
    用Windows命令轻松解决网络故障
    黑屏算啥!新方法轻松破解微软正版验证
    大文件不用愁 硬盘分区格式轻松转换
    分区格式轻松转换(图)
    教你一招,让你轻松处理系统的变量值

    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告

      Copyright 2006-2008 pcjx.com All Rights Reserved
    电脑技巧 版权所有 粤ICP备06059145号 地图
    门市地址:广东省佛山市南海区黄岐黄海路133号
    本网站所有内容未经许可不得转载或做其他使用
    电话:0757-81139980 QQ:83306923