爱因斯坦谜题解答三种算法比较Word格式文档下载.docx
《爱因斯坦谜题解答三种算法比较Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《爱因斯坦谜题解答三种算法比较Word格式文档下载.docx(29页珍藏版)》请在冰豆网上搜索。
5.Theownerofthegreenhousedrinkscoffee.
6.ThePallMallsmokerkeepsbirds.
7.TheowneroftheyellowhousesmokesDunhills.
8.Themaninthecenterhousedrinksmilk.
9.TheNorwegianlivesinthefirsthouse.
10.TheBlendsmokerhasaneighborwhokeepscats.
11.ThemanwhosmokesBlueMastersdrinksbier.
12.ThemanwhokeepshorseslivesnexttotheDunhillsmoker.
13.TheGermansmokesPrince.
14.TheNorwegianlivesnexttothebluehouse.
15.TheBlendsmokerhasaneighborwhodrinkswater.
Thequestiontobeansweredis:
Whokeepsfish?
这道迷题出自1981年柏林的德国逻辑思考学院。
据说世界上只有2%的人能出答案。
就连大名鼎鼎的爱因斯坦也成为此题大伤脑筋,所以这道题也经常被国外知名公司用做面试题目,相信许多朋友都只做出过一个答案,今天就用计算机来看看答案:
C#代码(代码来源:
tech.ccidnet./art/322/20040304/94061_1.html,在此感原作者):
using
System;
namespace
netsafe.math
{
public
class
ayst
///
<
summary>
问题中的所有元素
/summary>
string[,]
data
=
{
{"
黄房子"
"
蓝房子"
白房子"
红房子"
绿房子"
},
挪威人"
英国人"
德国人"
丹麦人"
瑞典人"
DUNHILL"
PRINCE"
混合烟"
"
PALL
MALL"
BLUE
MASTER"
咖
啡"
矿泉水"
茶"
牛奶"
啤酒
鱼"
恐龙"
马"
鸟"
狗"
}
};
answer用来存放答案
int[,]
answer
new
int[6,
6];
ALL
122];
int
count
1;
nLevel
0;
int[]
List
int[6];
static
void
Main(string[]
args)
ayst
c
ayst();
c.p();
///生成全排列到all
c.run();
Console.Read();
按任意键继续
run()
i1,
i2,
i3,
i4,
i5;
///通过逻辑条件顺序的有效选择来优化程序
for
(i1
i1
120;
i1++)///房子
///9
、挪威人住第一间房子
///14
、挪威人住在蓝房子旁边
///不满足条件就短路
if
(ALL[2,
i1]
!
2)
continue;
(int
j
5;
j++,
answer[j,
1]
ALL[j,
i1])
;
(i2
i2
i2++)///人种
2]
i2])
(ALL[1,
i2]
1)
///1、
英国人住在红房子里
///
(find(1,
4)
find(2,
2))
///4
、绿房子在白房子左边
5)
>
find(1,
3))
(i3
i3
i3++)///烟
3]
i3])
///13、
德国人抽PRINCE烟
(find(2,
3)
find(3,
///7
、黄房子主人抽DUNHILL烟
1))
(i4
i4
i4++)///饮料
4]
i4])
///8
、住在中间那间房子的人喝牛奶
(ALL[3,
i4]
///5
、绿房子主人喝咖啡
find(4,
///3
、丹麦人喝茶
///15
、抽混合烟的人的邻居喝矿泉水
(Math.Abs(find(3,
-
///12
、抽BLUE
MASTER烟的人喝啤酒
(find(3,
5))
(i5
i5
i5++)///宠物
5]
i5])
///10
、抽混合烟的人住在养鱼人的旁边
find(5,
///2
、瑞典人养了一条狗
///6
、抽PALL
MALL烟的人养了一只鸟
4))
///11
、养马人住在DUNHILL烟的人旁边
(Math.Abs(find(5,
///能活到这里的data,当然是答案喽
write_answer();
非常典型的用递归实现排列组合算法。
p()
nCount,
nJudge,
key;
nLevel++;
(nLevel
5)
writeall();
///有一种排列就写到All数组里
nLevel--;
return;
(nCount
nCount
nCount++)
key
(nJudge
nJudge
nJudge++)
==
List[nJudge])
break;
(key
0)
List[nLevel]
nCount;
p();
写入all数组
writeall()
i;
(i
i
i++)
ALL[i,
count]
List[i];
count++;
find(int
i,
j)
k;
(k
k
k++)
(answer[k,
i]
return
-1;
将答案打印出来
write_answer()
j++)
Console.Write(data[i
1,
+
);
Console.WriteLine();
运行以后结果是:
可以看出答案并不唯一,有许多组合理的答案。
还有一种暴力破解的算法
C#代码如下(代码来源:
System.Collections.Generic;
System.Text;
爱因斯坦迷题1
enum
国籍
英国,
瑞典,
丹麦,
挪威,
德国
颜色
红,
绿,
蓝,
黄,
白
宠物
鸟,
猫,
马,
鱼,
狗
饮料
水,
牛奶,
咖啡,
茶,
香烟
blends,
blue,
prince,
dunhill,
pall
ProTable
private
const
string
rule
1、在一条街上,有5座房子,喷了5种颜色。
2、每个房里住着不同国籍的人
3、每个人喝不同的饮料,抽不同品牌的香烟,养不同的宠物
问题是:
提示:
1、英国人住红色房子
2、瑞典人养狗
3、丹麦人喝茶
4、绿色房子在白色房子左面
5、绿色房子主人喝咖啡
6、抽Pall
Mall
香烟的人养鸟
7、黄色房子主人抽Dunhill
香烟
8、住在中间房子的人喝牛奶
9、
挪威人住第一间房
10、抽Blends香烟的人住在养猫的人隔壁
11、养马的人住抽Dunhill
香烟的人隔壁
12、抽Blue
Master的人喝啤酒
13、德国人抽Prince香烟
14、挪威人住蓝色房子隔壁
15、抽Blends香烟的人有一个喝水的邻居
Rule
get
rule;
}
T
0,
颜色,
宠物,
饮料,
N
//求排列
aid
int[120,
N];
ProTable()
i0
N;
i0++)
i1++)
i0)
i2++)
||
i3++)
i4++)
aid[k,
0]
i0;
i1;
i2;