序文
この一連の記事は、データ構造の学習に関する著者のメモです。何か問題がある場合は訂正してください。
質問の語幹
説明
ハノイの塔は、インド神話に由来するおもちゃです。
神は、オ・フーが3本の柱を作ったために世界を創造しました。柱の1つには、64枚の金色の円盤が上から下にサイズ順に積み上げられていました。
神はブラフマンに、下からサイズの順にディスクを別の柱に交換するように命じました。小さなディスクは拡大できず、一度に1つのディスクしか移動できないことが要求されました。
入力
スパンコールの数nを入力します。ここでn <= 10。
出力
スパンコールを動かすプロセス全体を出力します。サンプルフォーマットを参照してください。
サンプル
入力
2
出力
ディスク1をAからBに
移動ディスク2をAからCに
移動ディスク1をBからCに移動
分析
法則によれば
、プレートの場合は
、AカラムのプレートをCカラムに直接移動します。
それ以外の場合は、
最初にCからBの助けを借り
てAカラムのn-1プレートを移動し、Aのプレートを移動します。列をAからC
に移動し、最後にAを使用してn-1プレートをCに移動します。
- 上記の分析は、再帰形式で直接記述されています
コード
#include<stdio.h>
void hannuota(int n,char ch1,char ch2,char ch3)
{
if(n==1) //如果是一个盘子
{
printf("Move disk %d from %c to %c\n",n,ch1,ch3); //直接将A柱的盘子移到C柱
}
else //否则
{
hannuota(n-1,ch1,ch3,ch2); //先将A柱的n-1个盘子借助C移到B
printf("Move disk %d from %c to %c\n",n,ch1,ch3); //将A柱的盘子从A移到C
hannuota(n-1,ch2,ch1,ch3); //最后将B柱的n-1个盘子借助A移到C
}
}
int main()
{
int n;
scanf("%d",&n);
hannuota(n,'A','B','C');
}
入る
3
出力
ディスク1をAからCに
移動ディスク2をAからBに
移動ディスク1をCからBに
移動ディスク3をAからCに
移動ディスク1をBからAに
移動ディスク2をBからCに
移動ディスク1をAからCに移動