ハノイ問題のybt1205タワー

ハノイ問題のybt1205タワー

冬も継続する予定!

説明[タイトル]

知的玩具ヨーロッパの店舗で販売されている19世紀について、64枚のディスクからなる文字列が列の昇順に銅板上の3つのバー、上から下への左端の棒があります。目的は、テープ、ディスクのみを移動させることができ、すべての極、ディスクの中央に一番左のバーで、上部に小さなキャップを許可していません。

これは、我々は、ほぼすべての材料にこの問題を持っている、よく知られた問題です。その時は、唯一の市場にディスクを移動することができますし、トップのチャンクを許可していませんので、可動板64の数は、18,446,744,073,709,551,615

その後も、ほぼ万年必要がある、マイクロ秒ごと(出力しない)1つの動きを計算することができる場合、これは、天文学的数字です。我々は唯一の問題への解決策を見つけるとNの値が小さい場合ハノイの塔を解決することができ、ハノイ64層の塔を解決するためにコンピュータを使用することは困難です。

小から大にディスクが、番号を付けていると1、2、...

[Enter]を

3つの単一文字の文字列が続く整数(20未満)を入力します。

ナンバープレートの整数、最後の3つの文字は、3極数を表します。

[出力]

プレートの各ステップ移動の出力を記録します。移動ライン。

各移動レコード、例えば、A-> 3-> B形は、すなわち、プレート3の数は、レバーバーBから移動されます。

[サンプル入力】

2 a b c

[サンプル出力]

a->1->c a->2->b c->1->b

[説明]

まず、喜びの最初の波は、私がYBT試験は20000-アップをランキング!(Caijizihai)

実際、この質問は嘉兄(開始彼女のブログを)私は理解していなかった時に言って、後であっても、標準プロセス、およびTaichetaiwuではありません(もちろん、何のスパイシーなチキンハノイの塔があります)。

ルールは、ゲームをプレイを開始するために、実際の戦略から始まる、問題解決のアイデアに続いて、上記と言われています:

我々は、すべてのディスクが削除されたいので、最大ディスク上記第一の柱の上に別のものに移動し、その後、目標最大ディスクトレイに移動し、そして最後に、プレートの動きの残りの部分に移動することになります最大プレートを完了しました。

だから我々はゆうPanziの尖塔と呼ばれている最大のプレート、になるために三つの部分、シャーシに元の問題を分解することができるということ。

以下は喜ば:ネットワーク全体の方法を紹介する最もホットな弟の破壊が世界のハノイタワーの破壊を利用します。

世界を破壊するために3つのステップがあります。

ステップ1:テイク尖塔

ステップ2:モバイルシャーシ

ステップ3:尖塔を戻します

それを破壊しようとする家を急ぐための非常に簡単な、小さなパートナーどのように、ではありません!

しかし、20 <そう言ったが、それでもコンピュータ(ペンティアム学校室標準圧力)と、第二のみときにのみn個の場合を議論するので、ここでは、30枚のディスク(出力しない)を移動させる動きを計算します

私は上記のように、nディスクがある場合、その問題は、n番目のディスクを移動する、離れてn-1個のディスクになり、ケース内へのその後のn-1ディスクバック。再帰的な境界線はちょうどテイクの場合、あなたがターゲットポールにディスクに直接移動する限り、この時間です。だから、再帰関数を書くことができること:

void hanoi(int n,char A,char B,char C)//这里的A为起始杆,B为目标杆,C为终点杆
{
    if (n==1)
    {
        printf("%c->%d->%c\n",A,n,B);//直接拿过去,不跟他多bibi
        return;//递归边界
    }
    hanoi(n-1,A,C,B);//将n-1个盘子从A移到C(给大佬(本次最大圆盘)让道加让座)
    printf("%c->%d->%c\n",A,n,B);//本次操作的核心:将本次最大圆盘直接移至目标杆
    hanoi(n-1,C,B,A);//将n-1个盘子从C移回到B(移动完的最大圆盘所在地)
    return;
}

続きますあなたの直接のコピーのために完全なコード:

#include <iostream>
#include <cstdio>
using namespace std;
void hanoi(int n,char A,char B,char C)
{
    if (n==1)
    {
        printf("%c->%d->%c\n",A,n,B);
        return;
    }
    hanoi(n-1,A,C,B);
    printf("%c->%d->%c\n",A,n,B);
    hanoi(n-1,C,B,A);
    return;
}
int main()
{
    char A,B,C;
    int n;
    cin>>n>>A>>B>>C;
    hanoi(n,A,B,C);
    return 0;
}

ニース、しかし水Aのブログ記事

おすすめ

転載: www.cnblogs.com/Wild-Donkey/p/12229834.html