汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。
大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。
大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。
并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。 问应该如何操作?
从图中可以看出A柱上的N圆盘是最大的,又因为小圆盘上不能有大圆盘,大圆盘上可以放小圆盘。所以N圆盘上可以放其他所有的任意圆盘,这样的话我们完全可以将N圆盘看成空气,看成没有。那么我们的任务就变成了将从N-1盘1盘按顺序移动到B柱子上。然后将N盘移动到C盘上
再把B盘上移动到C盘上就行(这时C柱子上的N盘还可以看成空气,再把AB换换位置,又变成将B柱子上的圆盘移动到C柱子上,AB换位置递归来一遍就行)。而对于N-1盘1盘这一堆移动到B柱子上,我们也可以用这样的方法,将N-1看成空气,又变成了N-2到1盘移动到B柱子上。以此类推,直到只剩1圆盘,直接移动到C柱子上就行。
#include <iostream>
using namespace std;
void move(char A, char B){
cout << "move: " << A << "----->" << B << endl;
}
//其中,n代表盘子总数,x,y,z代表柱子
void hanoi(int n, char A, char B, char C){
if(n==1){
move(A,C);//最大的圆盘从A移动到C
}
else{
hanoi(n-1, A, C, B);
move(A,C);
hanoi(n-1, B, A, C);
}
}
int main() {
int n;
cout << "请输入A柱有多少圆盘" << endl;
cin >> n;
cout << "步骤" << endl;
hanoi(n,'A','B','C');
return 0;
}