假定三个柱子从左到右分别是A,B,C,要将A柱上的两个盘子移动到C柱上
普通汉诺塔问题要求每次移动后,小盘子都在大盘子上面,在普通汉诺塔的基础上
受限的汉诺塔要求每次移动盘子只能将盘子移动到中间的B柱上,或者从B柱上移走
下面以n=2为例子,即开始A柱只有两个盘子
普通汉诺塔步骤:
- 小盘子:A>>>B
- 大盘子:A>>>C
- 小盘子:B>>>C
受限汉诺塔步骤:
- 小盘子:A>>>B
- 小盘子:B>>>C
- 大盘子:A>>>B
- 小盘子:C>>>B
- 小盘子:B>>>A
- 大盘子:B>>>C
- 小盘子:A>>>B
- 小盘子:B>>>C
所以思路就是:
首先将n-1个圆盘借助B柱移动到C柱上并将最大的圆盘移到B柱上,然后将n-1个圆盘借助B柱移动到A柱上并将最大的圆盘移动到C柱上,最后借助B柱把n-1个圆盘移到C柱上
C++代码
#include<iostream>
using namespace std;
void hano(int n, char A, char B, char C) {
if (n == 1) {
cout << "step:A--->B" << endl;
cout << "step:B--->C" << endl;
}
else {
hano(n - 1, A, B, C); //借助B将n-1个盘子从A移动到C
cout << "step:A--->B" << endl;
hano(n - 1, C, B, A); //借助B将n-1个盘子从C移动到A
cout << "step:B--->C" << endl;
hano(n - 1, A, B, C); //借助B将n-1个盘子从A移动到C
}
}
void main() {
int k = 3; //设起始A上3个盘子
hano(k, 'A', 'B', 'C');
system("pause"); //VS特有
}
python实现的话,代码就更少了