世界难题算法

原创 2007年10月07日 10:33:00

 /*
 
  下面的问题相信很多人都听过:
  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了。
bitsCN.com中国网管联盟


 */

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;
  ///通过逻辑条件顺序的有效选择来优化程序 feedom.net国内最早的网管网站
  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();
    }
}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

世界七大数学难题与Hilbert的23个问题

世界七大数学难题与Hilbert的23个问题 本文参考:1987年版《数学家小辞典》、百度百科、维基百科 世界七大数学难题    这七个“千年大奖问题”是:  NP...

世界七大数学难题

大家来肯 七点数学难题 [1] P问题对NP问题 在一个周六的晚上,你参加了一个盛大的晚会。由于感到局促不安,你想知道这一大厅中是否有你已经认识的人。宴会的主人向你提议说,你一定认识那位正在甜点...
  • zzwu
  • zzwu
  • 2015-04-09 11:06
  • 1273

世界七大数学难题与Hilbert的23个问题

世界七大数学难题与Hilbert的23个问题July、二零一一年二月一日本文参考:1987年版《数学家小辞典》、百度百科----------------------------------------...

世界七大数学难题与Hilbert的23个问题

世界七大数学难题与Hilbert的23个问题 July、二零一一年二月十三日 本文参考:1987年版《数学家小辞典》、百度百科、维基百科 ----------------------------...

算法难题之巅

  • 2013-05-03 15:09
  • 508KB
  • 下载

USACO Sweet Butter, 难题,Bellman-Ford算法 + SPFA优化

这题碰到我头晕的时候,搞了几天没搞懂,参考了网上的代码 nocow的解释:http://www.nocow.cn/index.php/USACO/butter Bellman-Ford算法:h...

NYOJ 月老的难题 (最大二分图匹配,匈牙利算法)

题目链接;http://acm.nyist.net/JudgeOnline/problem.php?pid=239 月老的难题 时间限制:1000 ms  |  内存限制:65535 KB 难度...

遗传算法解决八数码难题

遗传算法解决八数码难题八数码难题是将一个数组序列通过3x3格式的拼图方式,经过多次滑动转换变成序列为“123804765”的序列。目标序列如图所示:1 2 3 8 0 4 7 6 5 本博...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)