2017-08-14 3 views
-1

若干修正されたTOHでは、4つのペグがあります。したがって順番に合計4^Nのディスク位置があります。 今はスルー行っていた解決策の一つに、所定の状態は、コードの下に使用して表されている -ハノイの塔のすべての州のバイナリ表現

for(int disc = 0; disc < N; disc++){ 
     state += tower[disc]<<(disc*2); 
    } 

タワー[ディスク] - >することができ、ディスクが現在位置している塔、(0,1 、2,3)

上記のコードでN = 3を使用すると、63が得られます。これは4^N -1です。したがって、数式は機能します。つまり、0〜63のすべての64の位置を表すことができます。私は数学的な相関関係を理解することができません。

あなたはすべての可能なディスクの位置を表すことができ、我々はさらにあなたが唯一の4つのペグの位置を持っているので、5

+0

「数式が機能する」ということを詳しく説明できますか?数値を使用してディスクの位置を符号化する方法を見つけ出すか、または2進数で問題を解決するという目標はありますか? – templatetypedef

+0

@templatetypedef -goalは、ディスク位置のコード化と上記の式がどのように機能しているかを理解することであり、問​​題を解決するものではありません。私は、Nの値やペグの数が変化したときに、どのように式を修正する必要があるのか​​を理解しようとしています。 –

答えて

1

を言うことができますするペグまたはNの数を変更した場合、それがどのように変化するかをどのように式の上に説明していただけますどのディスクもちょうど2ビット(00, 01, 10, 11 => 0, 1, 2, 3)で符号化できます。したがって、2での乗算は、各ディスクに整数state内の2つの独立したメモリ空間を与え、最初のディスクはビット0から始まり、2番目のビットはビット2となります。iディスクは(i - 1) * 2です。左シフト<<は、各ディスクのデータを正しいビット位置に移動します。 towerの値が空白のことでしょうオーバーフローその指定された2ビットシフト3、より大きいことが原因とどこか別のゲームロジックに誤りがあった場合 -

しかし、このコードは、「安全でない」ことができます。 - state |= ...あなたはまた、ビット単位のORの代わりの追加を使用することができます

state += (tower[disc] & 3) << (i * 2);

注:これを防ぐために、ビット単位のAND クランプデータに[0,3]に操作を行います。

実施例N = 3から、すべてのプレートがペグ4から始まっているように見える(すなわち、tower[3])。 N = 5に変更すると、N * 2より下のビットがすべて1に設定されるので、もう一度4^N - 1 = 1023が返されます。

+0

ありがとうございます@meogoesthedog。フォローアップの質問 - 私たちはInteger状態で2ビットの独立したメモリを割り当てた後、正しい位置に移動した後に(1 << 2 *ディスク)右に?、なぜ我々がやっているのですか(towerIndex << 2 * disc) 。また、2の倍率を別の数に変更する必要があるユースケースを教えてください。 –

+1

@タワー[ディスク]の各要素は、それらの2ビット空間に格納されているデータであるためです。あなたが '1 <<'を思いついたかどうかは分かりません。引き数のために2をいくつかの整数 'm 'に置き換えましょう。' m'は*最大*タワーインデックスをエンコードするために必要なビットの最小値*です。 5〜8塔が必要な場合は、索引ごとに3ビット必要です( 'm = 3 ')。一般に、 'T '個の塔の場合、インデックスごとに' m = ceil(log2(T)) 'ビットが必要です。 – meowgoesthedog

+0

N = 3、ペグ= 3と言うことができます.3ペグを表現するには2ビットが必要になるので、式は変わりません。すべてのディスクが最後のタワー[2]にあるとき、それは状態= 42を与えるが、合計可能状態は3^3 = 27であるので、42は無効状態である。何を変更する必要がありますか? –

関連する問題