1.4 递归求解汉诺塔问题
问题描述
有A,B,C三根杆子。A杆上穿有 N (N>1) 个圆盘,盘的尺寸从下网上依次变小。要求按下列规则将所有圆盘移至 C 杆:
- 每次只能移动一个圆盘;
- 大盘不能叠在小盘上面。
问:如何移?最少要移动多少次?
设计思路
结果输出
- 使用一个变量记录移动步骤,最后输出;
- 移动步骤直接输出。
基本算法
第一种情况:N等于1
- 直接将A柱上的盘移动到C柱。
第二种情况:N大于1
- 第一步:借助C柱将A柱上的N-1个盘移动到B柱。
- 第二步:将A柱最后一个盘(即最大盘)移动到C柱。
- 第三步:借助A柱将B柱上的N-1个盘移动到C柱。
代码实现
源代码
#include <iostream> using namespace std; int step = 0; //移动次数 void HanoiT(char,char,char,int); //求解汉诺塔问题 int main() { char x = 'A',y = 'B',z = 'C'; //三根柱子 int num =4; //问题规模 cout << "N = " << num << endl; HanoiT(x,y,z,num); cout << step << endl; //总步数 return 0; } void HanoiT(char x,char y,char z,int num) { if(num == 1) { step++; cout << "Step " << step << "----" << " Move " << " desk." << num << " from " << x << " to " << z << endl; } else { HanoiT(x,z,y,num-1); step++; cout << "Step " << step << "----" << " Move " << " desk." << num << " from " << x << " to " << z << endl; HanoiT(y,x,z,num-1); } }
运行结果