アルゴリズム問題:ハノタ問題の理解

1028 ワード

タイトル:
タイトルはこうです:ハノイタワー(Hanoi Tower)は、河内タワーとも呼ばれ、インドの古い伝説に由来しています.大梵天が世界を創造した時、ダイヤモンドの柱を3本作り、1本の柱の上に64枚の黄金円盤を下から上へ大きさ順に積み上げた.大梵天はボロモンに円盤を下から大きさ順に別の柱に並べ直すように命令した.また、小円盤ではいつでも円盤を拡大することができず、3本の柱の間で1回に1つの円盤しか移動できないことが規定されている.どうやって操作すればいいですか?
 
分析:
柱をA B Cとする.皿は全部でn枚あります.
まず皿が1つしかない場合は、AをCに直接移動するだけです.一方,n=2の場合,A−B,A−C,B−Cの過程を経る必要がある.
実は問題の解法は最大の皿をなんとかC柱に移動することです.それからそれにかかわらず、残りの皿をC柱の上に置きます.手順:
  1.n-1皿をB柱に移動します.
  2.一番大きい皿をC柱に移動します.
  3.B柱の上皿をC柱に移動します.
 
実際には,問題をマクロ全体から解決策を記述し,コード実行時に再帰アルゴリズムで実現し,大きな問題を個々の再帰的なサブ問題解決に解くことにより,開始柱A,補助柱B,目標柱Cの絶えず変化はサブ問題における皿の目標が異なるためである.
 
コード:
void hanoi(int num,char a,char b,char c)
{
    if(n == 1)
    {
        move(a,c);
    }
    else
    {
        hanoi(num-1,a,c,b);//  C   n-1   B   。
        move(a,c);//       C  
        hanoi(num-1,b,a,c);//  B      C   。
    }
}

void move(char object1,char object2)
{
    std::cout << object1 << "->" << object2 << std::endl;
}