首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >只是为了好玩-开始一个棘手的PHP逻辑问题

只是为了好玩-开始一个棘手的PHP逻辑问题
EN

Stack Overflow用户
提问于 2011-01-31 14:47:46
回答 3查看 1.8K关注 0票数 4

作为提高我作为一名PHP开发人员的技能的一种方法,我经常向自己挑战来自网站编程实践的问题。99%的时间,我可以自己解决谜语,但我在这个问题上卡住了,需要一些指导如何开始。这个谜语被称为“多重住所”。以下是问题所在:

贝克、库珀、弗莱彻、米勒和史密斯住在一栋只有五层楼的公寓楼的不同楼层。贝克不住在顶层。库珀不住在底层。弗莱彻既不是住在顶层也不是住在底层。米勒住在比库珀更高的楼层。史密斯不是住在弗莱彻家附近的地板上,弗莱彻不是住在库珀家附近的地板上,每个人都住在哪里?

我的基本问题是:我不知道如何测试和评估不同的逻辑情况。例如,如果我们想测试贝克是否属于一楼,如何才能最好地“填写”其余4人中的每个人的测试职位?我(很多)的尝试都以失败而告终,都是在巨大的If/else /else树的底部。

这不是为了家庭作业,金钱,或名声-只是一个谜语,我可以需要一些帮助开始!

更新的-这是我的解决方案!谢谢大家的投入,不一定要优化,但至少现在我明白了:

代码语言:javascript
运行
复制
<?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;
    }

?>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-31 16:58:40

有趣的问题。因为这是一个编程挑战,我认为最好的方法就是生成所有可能的人的安排,并测试他们是否正确。

因为您只是想要一个起点,所以我不会编写任何实际的代码,我只想概述一下解决它的方法:

  1. 因为所有的租户都住在不同的楼层,所以你需要使用一个“置换”算法来生成他们所有不同的可能安排。也就是说,你从一个像{1, 2, 3, 4, 5}这样的集合开始,每个元素代表一个人的楼层数,比如按贝克,库珀,弗莱彻,米勒,史密斯的顺序。你需要找到其他可能的安排。维基百科的算法相当简单,应该很容易实现。
  2. 对于您生成的每一个置换,您都需要测试是否所有条件都是正确的。如果任何条件都是错误的,停止测试,然后继续进行下一个置换。如果所有条件都满足了,你就完了。所有条件都很容易测试,例如: “贝克不住在顶层。”>> $baker != 5 “米勒住在比库珀更高的楼层。”>> $miller > $cooper 诸若此类。
票数 4
EN

Stack Overflow用户

发布于 2011-01-31 14:50:52

我想你可以把它格式化成一组线性(In)方程。

代码语言:javascript
运行
复制
B < 5
C > 1
F < 5
F > 1
M > C
|S - F| > 1
|F - C| > 1

加:B != C != F != S != M

现在将其输入到单纯形算法中,您就完成了:)

编辑:但是如果你想通过编程来解决这个问题,我想测试这些条件下的所有排列都要简单得多--只有5!他们中的一个。

票数 1
EN

Stack Overflow用户

发布于 2011-01-31 18:34:59

所以让我们把这些人叫做B,C,F,M,S。

基本上每个人都可以住在任何地方,所以我们有这样的开始情况:

代码语言:javascript
运行
复制
[BCFMS] [BCFMS] [BCFMS] [BCFMS] [BCFMS]

现在你说

贝克不住在顶层。

所以我们会有

代码语言:javascript
运行
复制
[BCFMS] [BCFMS] [BCFMS] [BCFMS] [CFMS]

库珀不住在底层。

所以我们最后得到了:

代码语言:javascript
运行
复制
[BFMS] [BCFMS] [BCFMS] [BCFMS] [CFMS]

弗莱彻既不是住在顶层也不是住在底层。

奥OK:

代码语言:javascript
运行
复制
[BMS] [BCFMS] [BCFMS] [BCFMS] [CMS]

米勒住在比库珀更高的楼层。

好的,M不能在比C低的位置上:

代码语言:javascript
运行
复制
[BS] [BCFS] [BCFMS] [BCFMS] [CMS]

而且,C不能在最后一楼,因为我必须在他上面:

代码语言:javascript
运行
复制
[BS] [BCFS] [BCFMS] [BCFMS] [MS]

(A)史密斯住在弗莱彻家附近的一层楼里。 (B)弗莱彻不是住在库珀家附近的一层楼。

所以在相邻的“箱子”(楼层)上没有So,F,F或C。

我们也知道

(C)住在公寓楼的不同楼层

按照(C),我们有两种可能的情况,一楼是B或S

让我们来接第二个案子(因为我们知道他的情况)

代码语言:javascript
运行
复制
[S] [BCFS] [BCFMS] [BCFMS] [MS]

根据(A):

代码语言:javascript
运行
复制
[S] [BC] [BCF] [BCF] [M]

所以我们也知道M生活在C之上(之前的步骤已经成立了,因为我们现在已经知道M已经在最后一层了):

代码语言:javascript
运行
复制
[S] [BC] [BCF] [BCF] [M]

根据(B)项,F和C都不能在三楼,在(C)项的影响下,由于进一步减少(每层只有一人),我们最终得到唯一可能的排列:

代码语言:javascript
运行
复制
[S] [C] [B] [F] [M]

因此,解决办法如下:

Smith,Cooper,Baker,Fletcher,Miller

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4852221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档