【发布时间】:2011-06-18 15:25:35
【问题描述】:
作为提高我作为 PHP 开发人员技能的一种方式,我经常挑战自己来自站点 Programming Praxis 的问题。 99% 的时间我可以自己解决谜题,但我被困在这个谜题上,需要一些关于如何开始的指导。这个谜语叫做“多居”。问题来了:
贝克、库珀、弗莱彻、米勒和史密斯住在一栋只有五层楼的公寓的不同楼层。贝克不住在顶层。库珀不住在底层。弗莱彻既不住在顶层也不住在底层。米勒住在比库珀更高的楼层。史密斯不住在弗莱彻家附近的楼层。弗莱彻不住在库珀附近的地板上。大家都住在哪里?
我的基本问题是:我不明白如何测试和评估不同的逻辑情况。所以举个例子,如果我们要测试贝克是否属于一楼,那么如何最好地为剩下的 4 个人每个人“填写”测试位置?我的(许多)尝试都在巨大的 If/else if/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;
}
?>
【问题讨论】:
-
..当然。如果不是这样,请告诉我们您尝试了什么
-
或许可以将其设为社区 wiki 帖子?
-
一种方法是查找一些排列算法。然后,您可以计算人和公寓的所有不同排列,并简单地测试每个排列,直到满足所有标准。
-
也许使用不同的语言 - 这看起来像是 Prolog 的工作!
-
对我来说,这听起来像是数独的变体(因为你需要根据一些规则“填空”)。如果尚未发布的答案,查找数独求解器可能会给您一个启动。