汉诺塔
描述
古代有一座汉诺塔,塔内有3个座A、B、C。
A座上有n个盘子,盘子大小不等,大的在下,小的在上,如图所示。
有一个和尚想把这n个盘子从A座移到C座,但每次只能移动一个盘子,并且自移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B座来放盘子。要求输出移动的步骤。
输入格式
输入一个正整数,表示汉诺塔内的盘子个数n(1<=n<=64)。
输出格式
输出移动的步骤,每行一步,如从A座移动到C座,输出“A-->C”。
输入输出示例
输入 | 输出 | |
示例 1 | 3 | A --> C
|
C++代码:
#include<bits/stdc++.h>
using namespace std;
void move(char A, char C){
cout << A << " --> " << C << endl; //打印一下路径,是从哪个塔到哪个塔
}
void Hanoi(int n, char A, char B, char C){
if(n == 1){ //如果初始只有1个盘子
move(A, C); //直接把A塔上的一个盘子移动到C塔就可以
return;
}
else {
Hanoi(n - 1, A, C, B); //移动n-1个盘子,从A移动到B塔,C塔是辅助塔
move(A, C); //A塔已经移走了n-1个盘子了,剩下那个必是最大的盘子,直接移动到C塔就可以了
Hanoi(n - 1, B, A, C); //移动n-1个盘子,从B塔移动到C塔,A塔是辅助塔
/*
Hanoi(n - 1, B, A, C);
这句话我的理解是,把B当做初始时的A来处理。此时B塔,相当于刚开始的A塔,
所以对B塔执行跟对刚开始的A塔类似的操作就可以了:
刚开始对A塔的操作:移动n-1个盘子,从A塔移动到B塔,C塔是辅助塔
现在对B塔的操作: 移动n-1个盘子,从B塔移动到C塔,A塔是辅助塔
*/
}
}
int main(){
int n;
cin >> n; //初始有几个盘子在A上
Hanoi(n, 'A', 'B', 'C'); //A、B、C分别表示三个塔
return 0;
}
Python代码:
def move(A, C):
print(A, end='')
print(' --> ', end='')
print(C)
def Hanoi(n, A, B, C):
if n == 1:
move(A, C)
return
else:
Hanoi(n - 1, A, C, B)
move(A, C)
Hanoi(n - 1, B, A, C)
n = eval(input())
Hanoi(n, 'A', 'B', 'C')