赛迪网 > IT技术 今日更新 > 文章
  IT资讯搜索
 
IT产品搜索
[程序开发][网管世界][网络安全][数据库技术]
[操作系统][嘉宾聊天·在线访谈][活动集锦]
[精彩专题][Symantec专区][订阅IT技术周刊]
[开发论坛][网管论坛][安全论坛][数据库论坛]
[操作系统论坛][Sybase专区][IBM dW技术专区]
[病毒求助][病毒与漏洞播报][文档·源码下载]

C#轻松解决世纪迷题

发布时间:2004.03.04 15:25     来源:赛迪网    作者:李志勇

下面的问题相信很多人都听过:
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
	{
/// <summary>
/// 问题中的所有元素
/// </summary>
string[,] data=	{{"黄房子","蓝房子","白房子","红房子","绿房子"},
{"挪威人","英国人","德国人","丹麦人","瑞典人"},
{"DUNHILL","PRINCE","混合烟", "PALL MALL","BLUE MASTER"},
{"咖 啡","矿泉水","茶","牛奶"," 啤酒 "},
{"鱼"," 恐龙","马",	"鸟","狗"}};
/// <summary>/// answer用来存放答案
/// </summary>
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();
				}
			}
		}
	}
}
}
/// <summary>
/// 非常典型的用递归实现排列组合算法。
/// </summary>
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--;
}
/// <summary>
/// 写入all数组
/// </summary>
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;
}
/// <summary>
/// 将答案打印出来
/// </summary>
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,
咖 啡,矿泉水,牛奶,茶, 啤酒 ,
鸟, 恐龙,马,鱼,狗,

(责任编辑:宋宏伟)


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· 全面掌握VisualC#实现UDP协议(一) (11-25) · VisualC#中托管Socket的实现方法(二) (11-20)
· Visual C#托管Socket的实现方法(一) (11-19) · 微软C#出现劲敌 IBM与Jboss联手攻其不备 (09-25)
· 如何用C#语言构造蜘蛛程序 (08-18) · 用Visual C#创建Windows服务程序 (05-08)
· “蚂蚁”爬进.NET (04-28) · 我是如何掉进C#的…… (04-04)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
  赛迪推荐  
  手机·资费 ·新品·导购·评测·手机资费·宽带
手机搜索  诺基亚 N73 MOTO Z6
  IT产品 ·笔记本·台式机·服务器·打印·投影
IT产品搜索 
  IT技术 ·开发·网管·安全·数据库·操作系统
  信息化 ·热点·专题·访谈·周刊·方案案例
[政务][电信][金融][农业][制造业][中小企业]
[CIO][ERP][协同][IT管理][中间件][电子商务]
[政策][地方][专家][评估][辞典][博客][社区]
· 专题:一路畅通构想曲——让出行不再遭遇堵车
· CIO工作亲历:企业ERP选型不能忽视"选人关"
· 综述:信息化建设给中国监狱带来的各种变化
· 金融业风险管理和法规遵从有五点需考虑的因素
· 保险业CIO关注:该如何建立统一高效的CRM体系
· 调查显示:多数CIO对IT规划仍存在困惑和误解
  博客·论坛 ·曾剑秋·项立刚·Java学习·网管