当前位置:编程学习 > C#/ASP.NET >>

一道爱因斯坦的思考题,爱因斯坦声称世界上只有2%的人能解出,你看呢?

/*爱因斯坦的思考题
在网上看到了个有趣的逻辑推理题,爱因斯坦声称世界上只有2%的人能解出:

有五个具有五种不同颜色的房间排成一排;

每个房间里分别住着一个不同国籍的人;

每个人都在喝一种特定品牌的饮料,抽一特定品牌的烟,养一特定的宠物;

没有任意两个人在抽相同品牌的香烟,或喝相同品牌的饮料,或养相同的宠物。

  问题:谁在养鱼作为宠物? 

  爱因斯坦给出如下线索:


英国人住在红色的房子里;

瑞典人养狗作为宠物;

丹麦人喝茶;

绿房子紧挨着白房子,在白房子的左边;

绿房子的主人喝咖啡;

抽Pall Mall牌香烟的人养鸟;

黄色房子里的人抽Dunhill牌香烟;

住在中间那个房子里的人喝牛奶;

挪威人住在第一个房子里面;

抽Blends牌香烟的人和养猫的人相邻;

养马的人和抽Dunhill牌香烟的人相邻;

抽BlueMaster牌香烟的人喝啤酒;

德国人抽Prince牌香烟;

挪威人和住在蓝房子的人相邻;

抽Blends牌香烟的人和喝矿泉水的人相邻。

           
           国家           房子           宠物           饮料           香烟
           挪威           黄色             猫         矿泉水        Dunhill
           丹麦           蓝色             马             茶         Blends
           英国           红色             鸟           牛奶       PallMall
           德国           绿色             鱼           咖啡         Prince
           瑞典           白色             狗           啤酒     BlueMaster
*/
/*
算法思路:
以房子的位置为主序,把国籍,颜色,宠物,饮料,香烟都作为该房子的一个成员,每一个成员都有可能
处在任何位置,为所有成员穷举每一个位置,再根据已知条件进行适当剪枝,找到唯一的解 
*/

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int main(void)
{
    string Title[5] = {"国籍","颜色","宠物","饮料","香烟"};
    struct {
        string nation;
        string color;
        string pet;
        string drink;
        string cigarette;
    }    House[5];//房子从左到右编号 

    House[0].nation = "挪威";//挪威人住在第一个房子里面
    House[1].color = "蓝色";//挪威人和住在蓝房子的人相邻,即蓝房子是第2个房子 
    House[2].drink = "牛奶";// 住在中间那个房子里的人喝牛奶

    for (int e=1; e<5; e++)    //表示英国人的房子序号
    for (int r=1; r<5; r++)//表示瑞典人的房子序号
    for (int d=1; d<5; d++)//表示丹麦人的房子序号
    for (int g=0; g<5; g++)//表示绿房子的序号
    for (int p=0; p<5; p++)//表示抽Pall Mall牌香烟的人的房子序号
    for (int y=0; y<5; y++)//表示黄色房子的序号
    for (int b=0; b<5; b++)//表示喝啤酒人的房子序号
    for (int h=0; h<5; h++)//表示养马的人的房子序号
    for (int cat=0; cat<5; cat++)//表示养猫的人的房子序号
    {
        int Germany = 10 - 0 - e - r - d;    //表示德国人的房子序号,德国人抽Prince牌香烟;
        int Blends = 10 - p - y - b - Germany;//表示抽Blends牌香烟的人的房子序号
        int white = 10 - 1 - e - g - y; //表示白房子的序号
        int water = 10 - 2 - d - g - b; //表示喝矿泉水的人的房子序号
        int fish = 10 - r - p - h - cat;//表示养鱼的人的房子序号
        
        bool A1 = (e!=1);    //英国人住在红色的房子里;根据房子和国家判断 
        bool A2 = (r!=e);    //瑞典人养狗作为宠物;根据国家和宠物判断 
        bool A3 = (d!=e && d!=r && d!=2);//丹麦人喝茶;根据国家和饮料判断
        bool A4 = (g!=1 && g!=2 && g!=e && g!=d);//绿房子的主人喝咖啡;根据颜色和饮料判断
        bool A5 = (p!=r);    //抽Pall Mall牌香烟的人养鸟;根据香烟和宠物判断
        bool A6 = (y!=e && y!=1 && y!=g && y!=p);//黄色房子里的人抽Dunhill牌香烟;根据颜色和香烟判断 
        bool A7 = (b!=2 && b!=d && b!=g && b!=p && b!=y);//抽BlueMaster牌香烟的人喝啤酒;根据香烟和饮料判断
        bool A8 = (h!=r && h!=p && (h==y+1 || h==y-1));//养马的人和抽Dunhill牌香烟的人相邻,根据香烟和宠物判断
        bool A9 = (white == g + 1);    //绿房子紧挨着白房子,在白房子的左边;
        bool A0 = (cat==Blends-1 || cat==Blends+1);//Blends牌香烟的人和养猫的人相邻;
        bool A11 = (water==Blends-1 || water==Blends+1);//抽Blends牌香烟的人和喝矿泉水的人相邻
        
        if (A1 && A2 && A3 && A4 && A5 && A6 && A7 && A8 && A9 && A0 && A11)
        {//把满足条件的序号填入结构数组 
            House[e].nation = "英国";
            House[e].color = "红色";
            House[r].nation = "瑞典";
            House[r].pet = "狗";
            House[d].nation = "丹麦";
            House[d].drink = "茶";
            House[g].color = "绿色";
            House[g].drink = "咖啡";
            House[p].cigarette = "Pall Mall";
            House[p].pet = "鸟";
            House[y].color = "黄色";
            House[y].cigarette = "Dunhill";
            House[b].cigarette = "BlueMaster";
            House[b].drink = "啤酒";
            House[h].pet = "马";
            House[Germany].nation = "德国";
            House[Germany].cigarette = "Prince";
            House[Blends].cigarette = "Blends";
            House[white].color = "白色";
            House[water].drink = "矿泉水";
            House[cat].pet = "猫";
            House[fish].pet = "鱼";     
            
            goto end;
        }
    }
end:
    for (int i=0; i<5; i++)
        cout << Title[i] << "\t";
    cout << endl << endl;
    
    for (int i=0; i<5; i++)
    {
        cout << House[i].nation << "\t"; 
        cout << House[i].color << "\t"; 
        cout << House[i].pet << "\t"; 
        cout << House[i].drink << "\t"; 
        cout << House[i].cigarette << "\t"; 
        cout << endl;
    }
    //输出到文件 
    ofstream out("爱因斯坦的思考题.txt");
    for (int i=0; i<5; i++)
        out << Title[i] << "\t";
    out << endl << endl;
    
    for (int i=0; i<5; i++)
    {
        out << House[i].nation << "\t"; 
        out << House[i].color << "\t"; 
        out << House[i].pet << "\t"; 
        out << House[i].drink << "\t"; 
        out << House[i].cigarette << "\t"; 
        out << endl;
    }
    out.close();
    
      system("pause"); 
      return 0;
}


转http://www.programfan.com/ --------------------编程问答-------------------- 果然强~~ --------------------编程问答-------------------- 有时间再仔细看 --------------------编程问答-------------------- 顶你 --------------------编程问答-------------------- 穷举法就没什么技巧了 --------------------编程问答-------------------- 果然强~~ --------------------编程问答-------------------- 强,真强,太强了。
牛,真牛,太牛了。 --------------------编程问答-------------------- 不用剪,穷举就可以了。 --------------------编程问答-------------------- 太火星了 --------------------编程问答-------------------- 要顶 --------------------编程问答-------------------- 太火星了 --------------------编程问答-------------------- 穷举... --------------------编程问答-------------------- 爱因斯坦真是太爱因斯坦了。 --------------------编程问答-------------------- 这玩意想多了,会进大腕里的疯人院的 --------------------编程问答-------------------- 手算了一下,大约花掉40多分钟才找到结果。
ps:并不难,只要你画好表格......... --------------------编程问答-------------------- 估計愛因斯坦不懂c++
說明樓主比愛因斯坦還牛。 --------------------编程问答-------------------- 太火星了 --------------------编程问答-------------------- 又是这些烂题、、、、 --------------------编程问答-------------------- 我是那2%
哈哈,我周围好多2% --------------------编程问答-------------------- 当一回牛人路过~ --------------------编程问答-------------------- jf --------------------编程问答-------------------- 估計愛因斯坦不懂c++
說明樓主比愛因斯坦還牛。
--------------------编程问答-------------------- 据说愛因斯坦当年是用算盘算出来的 --------------------编程问答-------------------- mark --------------------编程问答-------------------- 这个问题其实看你怎么解决,用程序穷举估计一秒钟就有答案了,
要是自己画图推理估计要半个小时,
要是自己什么都没有就在那里想.......估计一般人一辈子也想不出来吧!
反正我是觉得不画图实在是比较难想的。
不知道爱因斯坦当初说这句话的意思是不是说让大家不要画图、不要写程序
什么的! sigh。。。 --------------------编程问答-------------------- mark --------------------编程问答-------------------- 难道我是传说中的2% 一猜就对了。。。。。 --------------------编程问答-------------------- 原来爱因是个算命了 --------------------编程问答-------------------- 没有想象的那么难 手填表格ok 估计用穷举不是好算法 哪位高手开发一下新算法 --------------------编程问答-------------------- 果然强~~
--------------------编程问答-------------------- 爱因斯坦不懂C++
-----------------
我强烈同意,老家伙一天就整这玩意
难怪能搞出原子弹,太牛了
LZ,你比爱因斯坦强,呵呵

哪位老兄,给个更牛点的算法!!! --------------------编程问答-------------------- 强。
大学的时候搞了一上午没有整出来 --------------------编程问答-------------------- 笔算了一下,20多分钟,也不是很难 --------------------编程问答-------------------- 编程题。 --------------------编程问答-------------------- 牛B --------------------编程问答-------------------- 顶 --------------------编程问答-------------------- 没有oo --------------------编程问答-------------------- 外形人!!!!!!!!!!! --------------------编程问答-------------------- 爱兄能在没有计算机时代想出这个问题,的确属于非人类,强啊! --------------------编程问答-------------------- nb --------------------编程问答-------------------- 爱因斯坦的意思是说。。。。

世界上有40%的人生活在贫困中,吃饭都不饱,哪有心思想这些问题~~~ 
剩下那60%的人里有一半不懂英文,看不明白他问的是什么,
于是剩下30%,
然后又有一半是婴幼儿和很老的老人,
于是剩下15%,里面有三分之二当时正在对抗希特勒和日本鬼子,
所以剩下5%,这里面又有四成的人对这个问题没兴趣,看都不想看。。。
于是剩下3%,又有写人看完问题就被女朋友(男朋友)拉去XXX了,没空思考~~~


于是剩下2%认真看这个问题并认真想了一段时间,终于想出来了~~ --------------------编程问答-------------------- 咱们大家都是那2%~~~ --------------------编程问答-------------------- 楼上强 --------------------编程问答-------------------- 爱因斯坦很聪明 
但是他不会登录csdn 也解不了csdn上的很多问题
===============================================
DAY DAY UP --------------------编程问答-------------------- 难 --------------------编程问答-------------------- 强,太强了! --------------------编程问答-------------------- 又是算。。。 闪 --------------------编程问答-------------------- #include <stdio.h>
#include <conio.h>

typedef enum {nBritish, nSweden, nDenmark, nNorway, nGermany} Nationality;
typedef enum {hcRed, hcGreen, hcWhite, hcYellow, hcBlue} HouseColor;
typedef enum {bTea, bCoffee, bMilk, bBeer, bWater} Beverage;
typedef enum {cPALLMALL, cDUNHILL, cBLUEMASTER, cPRINCE, cMIX} Cigarettes;
typedef enum {pDog, pBird, pCat, pHorse, pFish} Pets;

#define MAX_METHOD 120  //  5!

int main(int argc, char *argv)
{
  int Method[MAX_METHOD][5];
  int i;
  int i0,i1,i2,i3,i4;
  int (*Nat), (*Col), (*Bev), (*Cig), (*Pet);
  int GreenPos, WhitePos;

  i = 0;
  for (i0 = 0; i0 < 5; ++i0)
  {
    for (i1 = 0; i1 < 5; ++i1)
    {
      if (i1 == i0) continue;
      for (i2 = 0; i2 < 5; ++i2)
      {
        if ((i2 == i0) || (i2 == i1)) continue;
        for (i3 = 0; i3 < 5; ++i3)
        {
          if ((i3 == i0) || (i3 == i1) || (i3 == i2)) continue;
          for (i4 = 0; i4 < 5; ++i4)
          {
            if ((i4 == i0) || (i4 == i1) || (i4 == i2) || (i4 == i3)) continue;
            Method[i][0] = i0;
            Method[i][1] = i1;
            Method[i][2] = i2;
            Method[i][3] = i3;
            Method[i][4] = i4;
            ++i;
          }
        }
      }
    }
  }

  for (Nat = Method[0], i0 = MAX_METHOD; i0 > 0; Nat += 5, --i0)
  {
    //  Condition 9
    if ((Nationality)(Nat[0]) != nNorway) continue;

    for (Col = Method[0], i1 = MAX_METHOD; i1 > 0; Col += 5, --i1)
    {
      for (Bev = Method[0], i2 = MAX_METHOD; i2 > 0; Bev += 5, -- i2)
      {
        //  Condition 8
        if ((Beverage)(Bev[2]) != bMilk) continue;

        for (Cig = Method[0], i3 = MAX_METHOD; i3 > 0; Cig += 5, --i3)
        {
          for (Pet = Method[0], i4 = MAX_METHOD; i4 > 0; Pet += 5, --i4)
          {
            GreenPos = 5;
            WhitePos = 5;
            for (i = 0; i < 5; ++i)
            {
              //  Condition 1
              if (((Nationality)(Nat[i]) == nBritish) && ((HouseColor)(Col[i]) != hcRed)) break;
  if (((HouseColor)(Col[i]) == hcRed) && ((Nationality)(Nat[i]) != nBritish)) break;

              //  Condition 2
              if (((Nationality)(Nat[i]) == nSweden) && ((Pets)(Pet[i]) != pDog)) break;
              if (((Pets)(Pet[i]) == pDog) && ((Nationality)(Nat[i]) != nSweden)) break;

              //  Condition 3
              if (((Nationality)(Nat[i]) == nDenmark) && ((Beverage)(Bev[i]) != bTea)) break;
              if (((Beverage)(Bev[i]) == bTea) && ((Nationality)(Nat[i]) != nDenmark)) break;

              //  Condition 4
              if ((HouseColor)(Col[i]) == hcGreen) GreenPos = i;
              if ((HouseColor)(Col[i]) == hcWhite) WhitePos = i;
              if (GreenPos > WhitePos) break;

              //  Condition 5
              if (((HouseColor)(Col[i]) == hcGreen) && ((Beverage)(Bev[i]) != bCoffee)) break;
              if (((Beverage)(Bev[i]) == bCoffee) && ((HouseColor)(Col[i]) != hcGreen)) break;

              //  Condition 6
              if (((Cigarettes)(Cig[i]) == cPALLMALL) && ((Pets)(Pet[i]) != pBird)) break;
              if (((Pets)(Pet[i]) == pBird) && ((Cigarettes)(Cig[i]) != cPALLMALL)) break;

              //  Condition 7
              if (((HouseColor)(Col[i]) == hcYellow) && ((Cigarettes)(Cig[i]) != cDUNHILL)) break;
              if (((Cigarettes)(Cig[i]) == cDUNHILL) && ((HouseColor)(Col[i]) != hcYellow)) break;

              //  Condition 10
              if (((Cigarettes)(Cig[i]) == cMIX) && (!(((i - 1 >= 0) && ((Pets)(Pet[i - 1]) == pCat)) || ((i + 1 < 5) && ((Pets)(Pet[i + 1]) == pCat))))) break;

              //  Condition 11
              if (((Pets)(Pet[i]) == pHorse) && (!(((i - 1 >= 0) && ((Cigarettes)(Cig[i - 1]) == cDUNHILL)) || ((i + 1 < 5) && ((Cigarettes)(Cig[i + 1]) == cDUNHILL))))) break;

              //  Condition 12
              if (((Cigarettes)(Cig[i]) == cBLUEMASTER) && ((Beverage)(Bev[i]) != bBeer)) break;
              if (((Beverage)(Bev[i]) == bBeer) && ((Cigarettes)(Cig[i]) != cBLUEMASTER)) break;

              //  Condition 13
              if (((Nationality)(Nat[i]) == nGermany) && ((Cigarettes)(Cig[i]) != cPRINCE)) break;
              if (((Cigarettes)(Cig[i]) == cPRINCE) && ((Nationality)(Nat[i]) != nGermany)) break;

              //  Condition 14
              if (((Nationality)(Nat[i]) == nNorway) && (!(((i - 1 >= 0) && ((HouseColor)(Col[i - 1]) == hcBlue)) || ((i + 1 < 5) && ((HouseColor)(Col[i + 1]) == hcBlue))))) break;

              //  Condition 15
              if (((Cigarettes)(Cig[i]) == cMIX) && (!(((i - 1 >= 0) && ((Beverage)(Bev[i - 1]) == bWater)) || ((i + 1 < 5) && ((Beverage)(Bev[i + 1]) == bWater))))) break;
            }
if (i == 5)
{
printf("%d %d %d %d %d\n", Nat[0], Nat[1], Nat[2], Nat[3], Nat[4]);
printf("%d %d %d %d %d\n", Col[0], Col[1], Col[2], Col[3], Col[4]);
printf("%d %d %d %d %d\n", Bev[0], Bev[1], Bev[2], Bev[3], Bev[4]);
printf("%d %d %d %d %d\n", Cig[0], Cig[1], Cig[2], Cig[3], Cig[4]);
printf("%d %d %d %d %d\n\n", Pet[0], Pet[1], Pet[2], Pet[3], Pet[4]);
}
          }
        }
      }
    }
  }

  return 0;
}

Result:
3 2 0 4 1
3 4 0 1 2
4 0 2 1 3
1 4 0 3 2
2 3 1 4 0

3 4 0 2 1
1 4 0 3 2
1 4 2 0 3
0 3 4 1 2
1 2 3 4 0

3 4 0 2 1
1 4 0 3 2
1 4 2 0 3
0 3 4 1 2
1 4 3 2 0

3 4 1 0 2
1 4 2 0 3
1 4 2 3 0
0 3 4 2 1
1 2 0 3 4

3 4 1 0 2
1 4 3 0 2
1 4 2 3 0
4 3 1 2 0
4 2 0 3 1

3 4 1 2 0
1 4 2 3 0
1 4 2 0 3
0 3 4 1 2
1 2 0 4 3

3 4 1 2 0
1 4 2 3 0
1 4 2 0 3
0 3 4 1 2
1 4 0 2 3
--------------------编程问答-------------------- up --------------------编程问答-------------------- 不错
收藏 --------------------编程问答-------------------- 条件太多,这个题目不好玩.
穷举就可以了. --------------------编程问答-------------------- $ --------------------编程问答-------------------- 爱因斯坦不懂C++
-----------------
我强烈同意,老家伙一天就整这玩意
难怪能搞出原子弹,太牛了
LZ,你比爱因斯坦强,呵呵

哪位老兄,给个更牛点的算法!!!

爱因斯坦搞过原子弹!!!!!!! --------------------编程问答-------------------- 这题做过, 根本不需要上程序, 自己排排就出来了.
再说了, 2%也算不得什么了不起的, IQ大概在135. 老爱的智商, 大概也在150以上, 恐怕都千分之一了.
我的那些题目, http://blog.csdn.net/Kakrat/archive/2007/08/05/1727271.aspx, 比这题有意思, 难度范围也大.


--------------------编程问答-------------------- 其实真的不难 --------------------编程问答-------------------- i服了u --------------------编程问答-------------------- qiang --------------------编程问答-------------------- 有么有c#的 --------------------编程问答-------------------- 强 --------------------编程问答-------------------- mark --------------------编程问答-------------------- 果然强~~ --------------------编程问答-------------------- mark~~~~ --------------------编程问答-------------------- 9.14.8.5.4.1.7.11.12.3.2.13.6.15.10用这个序号看条件,马上解决 --------------------编程问答--------------------
引用 6 楼 libinguest 的回复:
强,真强,太强了。
牛,真牛,太牛了。

楼主是旷世奇才呀,怎么没被用人组织发掘呢?多好的苗子,就这么白瞎了.
--------------------编程问答-------------------- 看的我脑壳痛。 --------------------编程问答-------------------- 2%也有一个亿了 --------------------编程问答-------------------- 很就以前就听说这个问题,不过我没答出来 --------------------编程问答-------------------- 呵呵,来看看啊。 --------------------编程问答-------------------- --------------------编程问答-------------------- 我告诉你们把,爱因斯坦就是个大骗子,他说吗就是嘛,大家都爱跟着她的逻辑思维走
补充:.NET技术 ,  非技术区
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,