作为提高我作为一名PHP开发人员的技能的一种方法,我经常向自己挑战来自网站编程实践的问题。99%的时间,我可以自己解决谜语,但我在这个问题上卡住了,需要一些指导如何开始。这个谜语被称为“多重住所”。以下是问题所在:
贝克、库珀、弗莱彻、米勒和史密斯住在一栋只有五层楼的公寓楼的不同楼层。贝克不住在顶层。库珀不住在底层。弗莱彻既不是住在顶层也不是住在底层。米勒住在比库珀更高的楼层。史密斯不是住在弗莱彻家附近的地板上,弗莱彻不是住在库珀家附近的地板上,每个人都住在哪里?
我的基本问题是:我不知道如何测试和评估不同的逻辑情况。例如,如果我们想测试贝克是否属于一楼,如何才能最好地“填写”其余4人中的每个人的测试职位?我(很多)的尝试都以失败而告终,都是在巨大的If/else /else树的底部。
这不是为了家庭作业,金钱,或名声-只是一个谜语,我可以需要一些帮助开始!
更新的-这是我的解决方案!谢谢大家的投入,不一定要优化,但至少现在我明白了:
<?php
function testThisOne ($testList) {
$MillerFloor = "";
$CooperFloor = "";
$SmithFloor = "";
$FletcherFloor = "";
foreach ($testList as $key => $person) if ($person == "Miller") $MillerFloor = $key;
foreach ($testList as $key => $person) if ($person == "Cooper") $CooperFloor = $key;
foreach ($testList as $key =>$person) if ($person == "Smith") $SmithFloor = $key;
foreach ($testList as $key => $person) if ($person == "Fletcher") $FletcherFloor = $key;
if ($testList[4] == "Baker") return false;
if ($testList[0] == "Cooper") return false;
if ($testList[0] == "Fletcher" || $testList[4] == "Fletcher") return false;
if ($MillerFloor < $CooperFloor) return false;
if (abs($SmithFloor - $FletcherFloor) == 1 || abs($CooperFloor - $FletcherFloor) == 1) return false;
return true;
}
function puzzleSolve1() {
$people = array("Baker","Cooper","Fletcher","Miller","Smith");
do {
shuffle($people);
} while (!testThisOne($people));
return $people;
}
?>发布于 2011-01-31 16:58:40
有趣的问题。因为这是一个编程挑战,我认为最好的方法就是生成所有可能的人的安排,并测试他们是否正确。
因为您只是想要一个起点,所以我不会编写任何实际的代码,我只想概述一下解决它的方法:
{1, 2, 3, 4, 5}这样的集合开始,每个元素代表一个人的楼层数,比如按贝克,库珀,弗莱彻,米勒,史密斯的顺序。你需要找到其他可能的安排。维基百科的算法相当简单,应该很容易实现。$baker != 5
“米勒住在比库珀更高的楼层。”>> $miller > $cooper
诸若此类。发布于 2011-01-31 14:50:52
我想你可以把它格式化成一组线性(In)方程。
B < 5
C > 1
F < 5
F > 1
M > C
|S - F| > 1
|F - C| > 1加:B != C != F != S != M
现在将其输入到单纯形算法中,您就完成了:)
编辑:但是如果你想通过编程来解决这个问题,我想测试这些条件下的所有排列都要简单得多--只有5!他们中的一个。
发布于 2011-01-31 18:34:59
所以让我们把这些人叫做B,C,F,M,S。
基本上每个人都可以住在任何地方,所以我们有这样的开始情况:
[BCFMS] [BCFMS] [BCFMS] [BCFMS] [BCFMS]现在你说
贝克不住在顶层。
所以我们会有
[BCFMS] [BCFMS] [BCFMS] [BCFMS] [CFMS]库珀不住在底层。
所以我们最后得到了:
[BFMS] [BCFMS] [BCFMS] [BCFMS] [CFMS]弗莱彻既不是住在顶层也不是住在底层。
奥OK:
[BMS] [BCFMS] [BCFMS] [BCFMS] [CMS]米勒住在比库珀更高的楼层。
好的,M不能在比C低的位置上:
[BS] [BCFS] [BCFMS] [BCFMS] [CMS]而且,C不能在最后一楼,因为我必须在他上面:
[BS] [BCFS] [BCFMS] [BCFMS] [MS](A)史密斯住在弗莱彻家附近的一层楼里。 (B)弗莱彻不是住在库珀家附近的一层楼。
所以在相邻的“箱子”(楼层)上没有So,F,F或C。
我们也知道
(C)住在公寓楼的不同楼层
按照(C),我们有两种可能的情况,一楼是B或S
让我们来接第二个案子(因为我们知道他的情况)
[S] [BCFS] [BCFMS] [BCFMS] [MS]根据(A):
[S] [BC] [BCF] [BCF] [M]所以我们也知道M生活在C之上(之前的步骤已经成立了,因为我们现在已经知道M已经在最后一层了):
[S] [BC] [BCF] [BCF] [M]根据(B)项,F和C都不能在三楼,在(C)项的影响下,由于进一步减少(每层只有一人),我们最终得到唯一可能的排列:
[S] [C] [B] [F] [M]因此,解决办法如下:
Smith,Cooper,Baker,Fletcher,Miller
https://stackoverflow.com/questions/4852221
复制相似问题