爱因斯坦谜题:谁养鱼(C++版)
记得以前自己也写过一个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;
}
//---------------------------------------------------------------------------