问题描述:
简单来讲,汉诺塔问题是这样的:
给定三根柱子,记为 A,B,C ,其中 A 柱子上有 n 个盘子,从上到下编号为 0 到 n−1 ,且上面的盘子一定比下面的盘子小。问:将 A 柱上的盘子经由 B 柱移动到 C 柱应该怎么移动?
移动时应注意:
① 一次只能移动一个盘子
②大的盘子不能压在小盘子上
分析:将n个盘子从A移到C可以分解为三步
(1)将n-1个盘子从A移到B;
(2)将A上剩下的一个盘子移到C上;
(3)将B上的n-1个盘子移到C上。
ps:复杂问题简单化,就看做A上只有两个盘子,则步骤就是 A-->B,A-->C,B-->C,完成!
#include<iostream>
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)
move( a, c);
else
{
hanoi(n - 1, a, c, b);
move(a, c);
hanoi(n - 1, b, a, c);
}
}
int main()
{
int m;
cin >> m;
hanoi(m, 'A', 'B', 'C');
return 0;
}
2//输入
A-->B
A-->C
B-->C
3
A-->C
A-->B
C-->B
A-->C
B-->A
B-->C
A-->C
4
A-->B
A-->C
B-->C
A-->B
C-->A
C-->B
A-->B
A-->C
B-->C
B-->A
C-->A
B-->C
A-->B
A-->C
B-->C