熱點推薦:
您现在的位置: 電腦知識網 >> 電腦故障 >> 正文

C#輕松解決世紀迷題:愛因斯坦算法

2013-11-11 23:57:50  來源: 電腦故障 

  下面的問題相信很多人都聽過
   有五棟五種顏色的房子
   每一位房子的主人國籍都不同
   這五個人每人只喝一種飲料只抽一種牌子的香煙只養一種寵物
   沒有人有相同的寵物抽相同牌子的香煙喝相同的飲料
  提示
   英國人住在紅房子裡
   瑞典人養了一條狗
   丹麥人喝茶
   綠房子在白房子左邊
   綠房子主人喝咖啡
   抽PALL MALL煙的人養了一只鳥
   黃房子主人抽DUNHILL煙
   住在中間那間房子的人喝牛奶
   挪威人住第一間房子
   抽混合煙的人住在養魚人的旁邊
   養馬人住在DUNHILL煙的人旁邊
   抽BLUE MASTER煙的人喝啤酒
   德國人抽PRINCE煙
   挪威人住在藍房子旁邊
   抽混合煙的人的鄰居喝礦泉水
  問題是 誰養魚?
  這道迷題出自年柏林的德國邏輯思考學院據說世界上只有%的人能出答案就連大名鼎鼎的愛因斯坦也成為此題大傷腦筋所以這道題也經常被國內外知名公司用做面試題目相信許多朋友都只做出過一個答案如果碰巧你屬於那%該怎麼辦呢沒關系如果這個問題用電腦來解決就非常easy了
  程序代碼如下
  using System;
  namespace netsafemath
  {
  public class ayst
   {
   ///
   /// 問題中的所有元素
   ///

   string[] data= {{黃房子 藍房子 白房子 紅房子 綠房子}
      {挪威人 英國人 德國人 丹麥人 瑞典人}
      {DUNHILL PRINCE 混合煙 PALL MALL BLUE MASTER}
      {咖 啡 礦泉水 牛奶 啤酒 }
      { 恐龍 }};
  
   ///
   /// answer用來存放答案
   ///

   int[] answer=new int[ ];
  int[] ALL=new int[];
   int count=;
   int nLevel = ;
   int[] List=new int[];
   public static void Main(string[] args)
   {
    ayst c=new ayst();
    cp(); ///生成全排列到all
    crun();
    ConsoleRead(); /// 按任意鍵繼續
  }
   void run()
   {
    int iiiii;
    ///通過邏輯條件順序的有效選擇來優化程序
    for (i=;i<=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();
  
      }
  
     }
     }
  
    }
    }
   }
  ///
   /// 非常典型的用遞歸實現排列組合算法。TW.WInGWIT.coM
   ///

   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 下編譯執行通過。如果你沒有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,
  咖 啡,礦泉水,牛奶,茶, 啤酒 ,
  鳥, 恐龍,馬,
From:http://tw.wingwit.com/Article/Fault/201311/10360.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.