下面的問題相信很多人都聽過
提示
問題是
這道迷題出自
程序代碼如下
using System;
namespace netsafe
{
public class ayst
{
///
/// 問題中的所有元素
///
string[
{
{
{
{
///
/// answer用來存放答案
///
int[
int[
int count=
int nLevel =
int[] List=new int[
public static void Main(string[] args)
{
ayst c=new ayst();
c
c
Console
}
void run()
{
int i
///通過邏輯條件順序的有效選擇來優化程序
for (i
{
/// 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