• 爱因斯坦谜题:谁养鱼(C++版)


    看   爱因斯坦谜题:谁养鱼(C#版)  http://www.cnblogs.com/yefanqiu/archive/2009/09/27/1575326.html
    记得以前自己也写过一个C++版本,时间飞快出来结果(小于1秒),因对一个条件判断有歧义(绿色房子在白色房子左面),所以出来7个结果,贴代码如下


    //---------------------------------------------------------------------------

    #include <vcl.h>
    //---------------------------------------------------------------------------

    #pragma hdrstop

    //---------------------------------------------------------------------------
    #pragma argsused
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>

    char *Colorr[]={"红","白","绿","黄","蓝"};

    char *Nationality[]={"英国","瑞典","丹麦","挪威","德国"};

    char *Drink[]={"咖啡","牛奶","水","啤酒","茶"};
    char *Cigarette[]={"Pall-Mall","Dunhill","Blends","Blue-Master","Prince"};
    char *Pet[]={"狗","鸟","猫","马","鱼"};
    int Order[120][5];
    int main(int argc, char* argv[])
    {
    int count=0;
    for(int i=0;i<5;i++)
       {
       for(int j=0;j<5;j++)
          {
          if (i==j) continue;
          for(int k=0;k<5;k++)
             {
             if (k==i || k==j) continue;
             for(int m=0;m<5;m++)
                {
                if (m==i || m==j || m==k) continue;
                for(int n=0;n<5;n++)
                   {
                   if (n==i || n==j || n==k || n==m) continue;
                   Order[count][0]=i;
                   Order[count][1]=j;
                   Order[count][2]=k;
                   Order[count][3]=m;
                   Order[count][4]=n;
                   count++;
                   }
                }
             }
          }
       }
    int a,b,c,d;
    count=0;
    int ii=0;
    int jj=0;
    int kk=0;
    int mm=0;
    int nn=0;
    /////////////////////////////////////////////////////////
    for(int i=0;i<120;i++)
    {
    // 4、绿色房子在白色房子左面   ???
    for (a=0;a<5;a++)
       if (Order[i][a]==2)
          break;
    for (b=0;b<5;b++)
       if (Order[i][b]==1)
          break;
    if (a-b!=-1)
    //if (a>b)
       continue;
    ii++;
    /////////////////////////////////////////////////////////
    for(int j=0;j<120;j++)
    {
    // 1、英国人住红色房子
    for (a=0;a<5;a++)
       if (Order[j][a]==0)
          break;
    if (Order[i][a]!=0)
       continue;
    // 9、 挪威人住第一间房
    for (a=0;a<5;a++)
       if (Order[j][a]==3)
          break;
    if (a!=0)
       continue;
    // 14、挪威人住蓝色房子隔壁
    for (a=0;a<5;a++)
       if (Order[j][a]==3)
          break;
    for (b=0;b<5;b++)
       if (Order[i][b]==4)
          break;

    if (abs(a-b)!=1)
       continue;

    jj++;
    /////////////////////////////////////////////////////////
    for(int k=0;k<120;k++)
    {
    // 3、丹麦人喝茶
    for (a=0;a<5;a++)
       if (Order[j][a]==2)
          break;
    if (Order[k][a]!=4)
       continue;

    // 5、绿色房子主人喝咖啡

    for (a=0;a<5;a++)
       if (Order[i][a]==2)
          break;
    if (Order[k][a]!=0)
       continue;

    // 8、住在中间房子的人喝牛奶         ???
    for (a=0;a<5;a++)
       if (Order[k][a]==1)
          break;
    if (a!=2)
       continue;

    kk++;
    /////////////////////////////////////////////////////////
    for(int m=0;m<120;m++)
    {
    // 7、黄色房子主人抽Dunhill 香烟
    for (a=0;a<5;a++)
       if (Order[i][a]==3)
          break;
    if (Order[m][a]!=1)
       continue;
    // 12、抽Blue Master的人喝啤酒
    for (a=0;a<5;a++)
       if (Order[m][a]==3)
          break;
    if (Order[k][a]!=3)
       continue;
    // 13、德国人抽Prince香烟
    for (a=0;a<5;a++)
       if (Order[m][a]==4)
          break;
    if (Order[j][a]!=4)
       continue;

    // 15、抽Blends香烟的人有一个喝水的邻居
    for (a=0;a<5;a++)
       if (Order[m][a]==2)
          break;
    for (b=0;b<5;b++)
       if (Order[k][b]==2)
          break;

    if (abs(a-b)!=1)
       continue;
    mm++;
    /////////////////////////////////////////////////////////
    for(int n=0;n<120;n++)
    {
    // 2、瑞典人养狗
    for (a=0;a<5;a++)
       if (Order[j][a]==1)
          break;
    if (Order[n][a]!=0)
       continue;

    // 6、抽Pall Mall 香烟的人养鸟
    for (a=0;a<5;a++)
       if (Order[m][a]==0)
          break;
    if (Order[n][a]!=1)
       continue;


    // 10、抽Blends香烟的人住在养猫的人隔壁
    for (a=0;a<5;a++)
       if (Order[m][a]==2)
          break;
    for (b=0;b<5;b++)
       if (Order[n][b]==2)
          break;
    if (abs(a-b)!=1)
       continue;


    // 11、养马的人住抽Dunhill 香烟的人隔壁
    for (a=0;a<5;a++)
       if (Order[m][a]==1)
          break;
    for (b=0;b<5;b++)
       if (Order[n][b]==3)
          break;
    if (abs(a-b)!=1)
       continue;
    nn++;

    AnsiString x;
    AnsiString xx;
    x="颜色=";
    for (int z=0;z<5;z++)
       x=x+xx.sprintf("%-12s ",Colorr[Order[i][z]]);
    puts(x.c_str());

    x="国籍=";
    for ( int z=0;z<5;z++)
       x=x+xx.sprintf("%-12s ",Nationality[Order[j][z]]);
    puts(x.c_str());

    x="饮料=";
    for ( int z=0;z<5;z++)
       x=x+xx.sprintf("%-12s ",Drink[Order[k][z]]);
    puts(x.c_str());

    x="香烟=";
    for ( int z=0;z<5;z++)
       x=x+xx.sprintf("%-12s ",Cigarette[Order[m][z]]);
    puts(x.c_str());
    x="宠物=";
    for ( int z=0;z<5;z++)
       x=x+xx.sprintf("%-12s ",Pet[Order[n][z]]);
    puts(x.c_str());
    x="----------------Result "+AnsiString(count)+"--------------------";
    puts(x.c_str());
    count++;

    }
    }
    }
    }
    }
    TheEnd:
    printf("round times %d %d %d %d %d\r\n",ii,jj,kk,mm,nn);
    printf("Press any key for end!");
    getch();
       return 0;
    }
    //---------------------------------------------------------------------------



  • 相关阅读:
    NodeJS 难点(网络,文件)的 核心 stream 二:stream是什么
    NodeJS 难点(网络,文件)的 核心 stream 一:Buffer
    了解了这些才能开始发挥jQuery的威力
    一般公司的大体要求
    js 的垃圾回收器 原理 坑 优化-- 待续
    iframe 问题集合
    图片预加载 js css预加载
    各种插件
    Django REST framework快速入门指南
    Vue.js devtool插件安装后无法使用的解决办法
  • 原文地址:https://www.cnblogs.com/huanGe/p/1575541.html
Copyright © 2020-2023  润新知