爱因斯坦谜题:谁养鱼(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;
}
//---------------------------------------------------------------------------



原文地址:https://www.cnblogs.com/huanGe/p/1575541.html