2011-01-31 14 views
4

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; 
    } 

?> 
+0

..sure:は、だからここソリューションです。そうでない場合は、試したことを教えてください – metrobalderas

+0

これをコミュニティのwiki投稿にすることはできますか? –

+0

1つのアプローチは、いくつかの順列アルゴリズムを調べることです。それで、人やアパートのすべての異なる順列を計算し、すべての基準を満たすまで各順列をテストするだけです。 –

答えて

4

興味深い問題です。それはプログラミング上の課題なので、それを行う最善の方法は、人々の可能なすべての取り決めを作り、それが正しいかどうかをテストすることだけだと思います。あなただけの出発点が欲しかったので

、私は実際のコードを記述するつもりはない、私はちょうど私がそれを解決するアプローチしたい方法の概要を説明します:

  1. すべてのテナントが異なるに住んでいるのでそれぞれ異なる可能な配置をすべて生成するには、「置換」アルゴリズムを使用する必要があります。つまり、{1, 2, 3, 4, 5}のようなセットで始まり、それぞれの要素は1人のフロア番号を表します。たとえば、Baker、Cooper、Fletcher、Miller、Smithの順です。あなたは他のすべての可能な配置を見つける必要があります。 The algorithm on wikipediaはかなり簡単で実装が容易でなければなりません。
  2. 生成するすべてのパーミュテーションについて、すべての条件が真であるかどうかをテストする必要があります。いずれかの条件が偽である場合は、テストを停止して次の順列に進みます。すべての条件が満たされたら、完了です。すべての条件は非常に簡単です。例:

    "Bakerは最上階には住んでいません。「>>$baker != 5

    "Miller氏はそうで>>"。クーパーよりも高い階に$miller > $cooper

    を住んでいると。

+0

ありがとうございました、それは完全な意味合いがあり、私のソリューション(私が掲載しようとしている)にほぼ沿っています。 –

+0

「1人の階数を表す各要素」は、集合内の位置を除いて階数を表し、個々の数字(そのうちの5つだけ)は個人を表す。このPOVから問題を調べ始めると、パーミュテーションの生成はベース5の54321になります(実際には、問題自体に基づいてさらに最適化を適用できます)。とにかく私からの+1も!あなたがあなたの答えを改善するなら、素晴らしいでしょう。 – Flavius

1

私はあなたが方程式(中)線形のこのセットをフォーマットすることができると思います。

B < 5 
C > 1 
F < 5 
F > 1 
M > C 
|S - F| > 1 
|F - C| > 1 

これらのプラス:B = C = F = S = M

今すぐsimplex algorithmにこれを供給し、あなたが:)

EDITをやっています!!!!しかし、あなたが解決したい場合これはプログラム的に、私はこれらの条件のすべての順列をテストする方がはるかに簡単だろうと思う - わずか5です!そのうちの。

+0

5フロアしかないので、 'C> 1'と' F> 1'ではないでしょうか? –

+0

そうですね、私はインデックスをめちゃくちゃにしました:) –

1

それでは、BCFM S.

者を呼びましょう基本的に誰もがどこにでも住むことができるので、この開始の状況があります:

[BCFMS] [BCFMS] [BCFMS] [BCFMS] [BCFMS] 

今話しています

ベイカーは最上階には住んでいません。

だから、私たちは

[BCFMS] [BCFMS] [BCFMS] [BCFMS] [CFMS] 

クーパーは、下の階に住んでいないでしょう。

だから我々はで終わる:

フレッチャーは、上部または底床のいずれかに住んでいない
[BFMS] [BCFMS] [BCFMS] [BCFMS] [CFMS] 

Ookay:

[BMS] [BCFMS] [BCFMS] [BCFMS] [CMS] 

ミラーはクーパーよりも高い階に住んでいます。

[OK]を、MはCよりも低い位置にすることはできません。

[BS] [BCFS] [BCFMS] [BCFMS] [CMS] 

そしてMは彼の上でなければならないためにも、Cは、最後の床の上に置くことはできません。

[BS] [BCFS] [BCFMS] [BCFMS] [MS] 

(A):スミスはフレッチャーの隣の階に住んでいません。

(B):Fletcherは、Cooperの隣の階には住んでいません。

隣接する「ボックス」(フロア)にS-F、F-S、F-CまたはC-Fはありません。

そして、我々はまた、

(C)ことを知っている:マンション(C)に準拠

の異なる階に住んで、我々は2可能な状況、一階というBさんを持っていますまたはSの

はのは、後者の場合を見てみましょう

[S] [BCFS] [BCFMS] [BCFMS] [MS] 
(我々は彼について(A)を知っているので) (A)によると、

[S] [BC] [BCF] [BCF] [M] 

だから我々はまた、(私たちは今では最後の床の上にあることを確認するためにMを知っているように、前のステップでは、すでに真である)、MはCの上に住んでいることを知っている:

[S] [BC] [BCF] [BCF] [M] 

(B)によれば、FもCも3階に存在することはできず、(C)の影響を受けて、さらなる削減(1人のフロアにつき1人のみ)のために、

[S] [C] [B] [F] [M] 

スミス、クーパー、ベイカー、フレッチャー、ミラー

+0

恐ろしく、それは非常に読みやすい内訳です。私はこの記事を読む前に私の "ラウンドワン"解決策を考え出しましたが、今私は心の改善があります。ありがとうございました! –

+0

私の答えは純粋にmatematicalであり、プログラム的ではありませんが、私が助けることができてうれしいです。 – Flavius

関連する問題