爱因斯坦难题C++解法
传说下面是爱因斯坦在20世纪初出的一道测试题。他说世界上有99%的人回答不出这道题,
看看你是否属于另外的1%?题目如下:
前提:
1
2
3
4
条件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
问题:谁养鱼?
解法:
利用数组和循环:
用5个数组(数组名)表示5种属性,用1、2、3、4、5分别代替各种属性的具体取值
数组的下标表示房间号,数组元素的取值表示某房间某属性的具体取值的代号
房间号(即数组下标)也表示方位,房间号小的为左,大的为右,下标相邻即房间相邻
房间
国家
颜色
饮品
香烟
宠物
取值
条件化简:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
C++源代码:
//爱因斯坦难题
//程序设计:万道濮
//说明:此版本是完美版
#include<iostream.h>
int
{
cout<<endl;
cout<<"
cout<<"
cout<<"
cout<<"================================================================================";
int
int
char
int
cout<<"
cout<<"n前提:n";
cout<<"
cout<<"
cout<<"
cout<<"
cout<<"条件:n";
cout<<"
cout<<"
cout<<"
cout<<"
cout<<"
cout<<"
cout<<"
cout<<"
cout<<"
cout<<"
cout<<"
cout<<"
cout<<"
cout<<"
cout<<"
cout<<"问题:谁养鱼?n";
cout<<"n";
sl: cout<<"输入“k”开始解答此难题,输入“q”退出程序:";
cin>>cmd;
cout<<endl;
if(cmd=='q'
return
else
goto
else
//先求1、2、3、4、5五个数字的所有排列情况
//下面开始用排列组合的方法排列5个数字
key:k=0; //k记录排列组合的种数
p1=0; //初始化下面循环所需参数为0
while(5-p1) //先放置数字1,数字1有5个位置可以选择
{
for(i=0;i<5;i++) //每次从下层循环回到此处都要先清空上次的排列
a[i]=0;
p1++; //p1记录数字1的当前放置次数
for(i=0,c1=0;i<5;i++)
if(a[i]==0)
p2=0; //初始化下面循环所需参数为0
while(4-p2) //放置数字2,放置好数字1后,数字2有4个位置可以选择
{
for(i=0;i<5;i++) //每次从下层循环回到此处都要先清除上次排列中的2、3、4、5
if(a[i]!=1)
p2++; //p2记录数字2的当前放置次数
for(i=0,c2=0;i<5;i++)
if(a[i]==0)
p3=0; //初始化下面循环所需参数为0
while(3-p3) //放置数字3,放置好数字2后,数字3有3个位置可以选择
{
for(i=0;i<5;i++) //每次从下层循环回到此处都要先清除上次排列中的3、4、5
if(a[i]==3
p3++; //p3记录数字3的当前放置次数
for(i=0,c3=0;i<5;i++)
if(a[i]==0)
p4=0; //初始化下面循环所需参数为0
while(2-p4) //放置数字4,放置好数字3后,数字4有2个位置可以选择
{
for(i=0;i<5;i++) //每次从下层循环回到此处都要先清除上次排列中的4、5
if(a[i]==4
p4++; //p4记录数字4的当前放置次数
for(i=0,c4=0;i<5;i++)
if(a[i]==0)
for(i=0;i<5;i++) //放置数字5,放置好数字4后,只剩1个位置来放5,故不用循环
if(a[i]==0)
//五个数字的一种排列完成,将此排列记录在数组t[k][5]中
for(i=0;i<5;i++)
{t[k][i]=a[i];}
k++; //k记录排列组合的种数
}
}
}
}
//1、2、3、4、5五个数字的所有排列情况算完,都记录在数组t[][]中
//下面开始用t[][]中的排列组合所有属性,并判断这种组合是否满足题意
k=0; //k记录正确答案的个数
p1=0;
while(120-p1) //通过循环组合“国家”属性
{ //9
if(t[p1][0]!=1)
for(i=0;i<5;i++)
p1++; //p1指向下一种排列情况
p2=0;
while(120-p2) //通过循环组合“颜色”属性
{ //14
if(t[p2][1]!=2)
for(i=0;i<5;i++)
p2++; //p1指向下一种排列情况
p3=0;
while(120-p3) //通过循环组合“饮品”属性
{ //8
if(t[p3][2]!=3)
for(i=0;i<5;i++)
p3++; //p1指向下一种排列情况
p4=0;
while(120-p4) //通过循环组合“香烟”属性
{
for(i=0;i<5;i++)
p4++;
p5=0;
while(120-p5) //通过循环组合“宠物”属性
{
for(i=0;i<5;i++)
p5++;
//所有属性的一种组和完成,下面判断这种组合是否满足题意
//若有一个条件不满足,就退出本次循环,并继续下次循环,即下一组组合
//1
for(i=0;i<5;i++)
{if(a[i]==4)
if(b[i]!=4)
//2
for(i=0;i<5;i++)
{if(a[i]==3)
if(e[i]!=3)
//3
for(i=0;i<5;i++)
{if(a[i]==5)
if(c[i]!=5)
//4
for(i=0;i<5;i++)
{if(b[i]==1)
for(j=0;j<5;j++)
{if(a[j]==5)
if(i>=j)
//5
for(i=0;i<5;i++)
{if(b[i]==1)
if(c[i]!=1)
//6
for(i=0;i<5;i++)
{if(e[i]==5)
if(d[i]!=5)
//7
for(i=0;i<5;i++)
{if(b[i]==3)
if(d[i]!=3)
//10
for(i=0;i<5;i++)
{if(e[i]==2)
if(i==0)
if(i>0
if(i==4)
//11
for(i=0;i<5;i++)
{if(e[i]==4)
if(i==0)
if(i>0
if(i==4)
//12
for(i=0;i<5;i++)
{if(c[i]==4)
if(d[i]!=4)
//13
for(i=0;i<5;i++)
{if(a[i]==2)
if(d[i]!=2)
//15
for(i=0;i<5;i++)
{if(c[i]==2)
if(i==0)
if(i>0
if(i==4)
//所有条件都判断完毕,若程序执行到此而没有退出本次循环
//说明此组合满足题意,是正确答案,下面就输出这种组合
//输出答案后,继续判断下一种组合,看是否还有其他答案
k++; //k记录正确答案的个数
cout<<"n————————爱因斯坦难题答案————————nn";
//下面输出所问问题的答案
cout<<"
for(i=0;i<5;i++) //寻找养鱼的人对应的数组元素
{if(e[i]==1)
switch
{
case
break;
case
break;
case
break;
case
break;
case
break;
}//问题答案输出完毕
cout<<"
cout<<"
//输出答案的所有“国家”属性
cout<<"
for(i=0;i<5;i++)
{
switch
{
case
break;
case
break;
case
break;
case
break;
case
break;
}
}
cout<<"nn"; //换行
//输出答案的所有“颜色”属性
cout<<"
for(i=0;i<5;i++)
{
switch
{
case
break;
case
break;
case
break;
case
break;
case
break;
}
}
cout<<"nn"; //换行
//输出答案的所有“饮品”属性
cout<<"
for(i=0;i<5;i++)
{
switch
{
case
break;
case
break;
case
break;
case
break;
case
break;
}
}
cout<<"nn"; //换行
//输出答案的所有“香烟”属性
cout<<"
for(i=0;i<5;i++)
{
switch
{
case
break;
case
break;
case
break;
case
break;
case
break;
}
}
cout<<"nn"; //换行
//输出答案的所有“宠物”属性
cout<<"
for(i=0;i<5;i++)
{
switch
{
case
break;
case
break;
case
break;
case
break;
case
break;
}
}//答案的所有属性输出完毕
cout<<"nn"; //换行
}//通过循环组合“宠物”属性的循环完毕
}//通过循环组合“香烟”属性的循环完毕
}//通过循环组合“饮品”属性的循环完毕
}//通过循环组合“颜色”属性的循环完毕
}//通过循环组合“国家”属性的循环完毕
cout<<endl;
cout<<"====================计算完毕===================nn";
cout<<"
cout<<"================程序设计:万道濮===============nn";
s2: cout<<"输入“r”重新解答此难题,输入“q”退出程序:";
cin>>cmd;
cout<<endl;
if(cmd=='q'
return
else
goto
else
}//主程序main()结束
最后答案: