PHPデベロッパーとしての自分のスキルを向上させる手段として、私はしばしばサイトProgramming Praxisの問題に挑戦します。 99%は自分で謎を解決することができますが、私はこの1つに詰まっていて、始める方法についていくつかのガイダンスが必要です。この謎は「複数の住居」と呼ばれています。ここに問題があります:ちょっと面白い - 難しいPHPロジック問題を始めよう
ベイカー、クーパー、フレッチャー、ミラーとスミスは、5フロアしかないアパートの異なるフロアに住んでいます。ベイカーは最上階には住んでいません。クーパーは一番下の階には住んでいない。フレッチャーは上層階または下層階には住んでいません。ミラーはクーパーよりも高いフロアに住んでいます。スミスはフレッチャーの隣の階に住んでいません。フレッチャーは、クーパーの隣の階には住んでいません。みんなはどこに住んでいるの?
私の基本的な問題は次のとおりです。さまざまな論理的な状況をテストして評価する方法を理解できません。たとえば、ベイカーが1階に所属しているかどうかをテストしたい場合、残っている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;
}
?>
..sure:は、だからここソリューションです。そうでない場合は、試したことを教えてください – metrobalderas
これをコミュニティのwiki投稿にすることはできますか? –
1つのアプローチは、いくつかの順列アルゴリズムを調べることです。それで、人やアパートのすべての異なる順列を計算し、すべての基準を満たすまで各順列をテストするだけです。 –