网站建设| 数据库类| 图形图象| 程序设计| 现代办公| 操作系统| 考试认证| 网络技术| 软件工程| 电脑相关| 文学作品
网站开发| 网页制作| 操作系统| 图象图形| 考试认证| 数据库类| 程序设计| 硬件技术| 现代办公| 网络技术| 笑话频道
 
您的位置: 电脑书库首页-> 电脑文摘-> 程序设计-> C/C++/VC-> C#轻松解决世纪迷题

C#轻松解决世纪迷题
作者:佚名 来源:InterNet 加入时间:2005-1-28
相关文章
  • 用C#获取浏览文件夹对话框
  • 相关书籍:
  • Asp Net密技集錦(C#)
  • ASP.NET基础教程—C#案例版
  • C#知识类库
  • C#深入浅出全接触
  • C#设计模式
  • C#应用程序开发全程演练
  • C#2008和.NET 3.5平台
  • c#2008从入门到精通
  • DATA STRUCTURES AND ALGORITHMS USING C#
  • C#.NET 开发者手册
  • 下面的问题相信很多人都听过:
    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,
    咖 啡,矿泉水,牛奶,茶, 啤酒 ,
    鸟, 恐龙,马,鱼,狗,

    [文章录入员:nancy]

    相关文章
  • 用C#获取浏览文件夹对话框
  • 相关书籍:
  • Asp Net密技集錦(C#)
  • ASP.NET基础教程—C#案例版
  • C#知识类库
  • C#深入浅出全接触
  • C#设计模式
  • C#应用程序开发全程演练
  • C#2008和.NET 3.5平台
  • c#2008从入门到精通
  • DATA STRUCTURES AND ALGORITHMS USING C#
  • C#.NET 开发者手册
  • 本站推荐内容

    近期主机类热搜关键词:
    美国服务器 美国服务器租用 海外服务器租用 国外服务器租用

    C/C++/VC
    C/C++/VC
    C++Builder
    Basic/VB类
    Delphi/Pascal
    Java编程
    FORTRAN
    其它
    电脑教程阅读排行
    ·新手入门:c++经典
    ·VC开发实例
    ·ping的源程序
    ·Visual C++编程技巧之一
    ·Visual C++程序设计中的...
    ·Windows 中不规则窗体的编...
    ·扔掉Socket实现网络编程
    ·例解用 VC++ 6.0 实现 ...
    ·VC实现PC并行端口数字信息输入...
    ·轻轻松松C to C++(一)