C言語 - ハノイの塔ステップm

ハノイの塔のm番目のステップ

著者:ターボ制限時間:3S章:再帰

問題の説明:

A、B、C、及び少数の皿の大きさは、3本の異なるロッド所与。これらのプレートは、ロッドAのサイズ、上部の最小に従って降順に設定します。今タスクは、C Aは、バーを積層レバーからプレートを移動し、元の順序を維持することです。タスクを実行する際に、プレートのみいつでも、移動することができ、上記小板上に大きなプレートを許可しない、Bは補助記憶ロッドレバーとして使用することができます。探している:n個のディスクの合計、ロッドを移動させる過程においてm番目の工程とである棒から。

説明を入力します。

標準入力デバイス(通常はキーボード)からあなたのプログラムのニーズは、テストデータの複数のセットを読み込みます。二つのデータの間で入力データの各ラインは、プレートの整数nを、1≤n≤10の各入力線、及びステップ数mは、スペースで区切られました。行と余分なスペース、2つのデータセット間の余分な空白行の行の終わりの始まり。

出力説明:

各テストケースのために、1つの行に対応する(一般的に端末プログラムに関する)標準の出力デバイスをプログラムする必要がある最初のステップでA Mから移動するように、順次、回答、ステップ移動のm番目の出力線の場合に出力されます(引用符なし)B、出力 "A-B"。m番目のステップ移動が存在しない場合、出力は「なし」(引用符なし)。

2つのデータセット間の空白行ない、フロントとリアの最後群ない空白行の最初のセット。
思考:
ハノイの塔m番目のステップを求めることは、グローバル変数を設定するために使用される再帰主要なアイデア、私は私が関係決定されるM、及びフラグFlagと

#include <stdio.h>
int i=0,flag=-1;
void move(int m,char x,char y){
	i++;
	if(i==m){
		printf("%c--%c\n",x,y);	
		flag=1;
	}
			
}
int hanoi(int n,int m,char a,char b,char c){	
    if(n==1){
        move(m,a,c);//只有一个,A直接到C	
     }
    else{
        hanoi(n-1,m,a,c,b);//把A的n-1个盘子移到B
        move(m,a,c); //把最后一个盘子从A移到C
        
        hanoi(n-1,m,b,a,c);//把B柱n-1个盘子移到C
    }
}
int main(){
	int n,m;
	while(scanf("%d%d",&n,&m)!=EOF){
		hanoi(n,m,'A','B','C');
		if(flag==-1)
			printf("none\n");
		i=0;
		flag=-1;
	}
	return 0;
}

ここに画像を挿入説明

リリース8元の記事 ウォンの賞賛6 ビュー1409

おすすめ

転載: blog.csdn.net/weixin_44252790/article/details/104090071