C語言——漢諾塔的m步

漢諾塔問題的第m步

作者: Turbo時間限制: 3S章節: 遞歸

問題描述 :

給定三根杆A、B、C和大小不同的幾個盤子。這些盤子按尺寸遞減順序套在A杆上,最小的在最上面。現在的任務是把這些盤子從A杆移到C杆且保持原來堆放順序。在實現任務時,每次只能移動一個盤子,且任何時刻不允許大的盤子放在小的盤子上面,B杆可以作爲輔助存放杆。求:總共有n個圓盤時,搬動過程中的第m步是從哪個杆到哪個杆。

輸入說明 :

你的程序需要從標準輸入設備(通常爲鍵盤)中讀入多組測試數據。每組輸入數據由一行組成,每行輸入一個整數表示盤子數n,1≤n≤10,以及步數m,兩個數據之間以一個空格分隔。行首和行尾沒有多餘的空格,兩組數據之間也沒有多餘的空行。

輸出說明 :

對每組測試數據,你的程序需要向標準輸出設備(通常爲啓動該程序的終端)依次輸出一行對應的答案,該行中輸出第m步移動的情況,如第m步是從A移到B,則輸出“A–B”(不包括引號)。如果移動過程不存在第m步,則輸出“none” (不包括引號)。

兩組數據之間無空行,第一組前及最後一組後也無空行。
思路:
漢諾塔主要是用遞歸的想法,求第m步的時候設置了全局變量i用來判斷m和i的關係,並用了一個標記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;
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章