教学目标
- 使用小朋友法解题
- 绘制dfs树
汉诺塔游戏
汉诺塔(tower of Hanoi)问题。有
移动时有如下的要求:
- 一次只移动一个盘;
- 不允许把大盘放在小盘上边;
- 可使用任意一根立柱暂存圆盘
在线游戏 : https://zhangxiaoleiwk.gitee.io/h.html
分析
通过上面的游戏,发现
- 一定要把前
个盘子移动到中间柱 - 起始柱现在只有一个盘子
,然后把第 个盘子移动到目标柱 - 最后把前
个盘子从中间柱移动到目标柱
设
- 起始柱:
- 中间柱:
- 目标柱:
- 把前
盘子从起始柱移动到目标柱: - 第二个参数表示 起始柱是哪个柱,其它同理
现在想一想有一个小朋友,他的任务是:把前
代码
#include <iostream>
using namespace std;
//n 盘子的数量
//a,b,c 起始柱,中间柱,目标柱
int hanoi(int n,char a,char b,char c) {
if( n == 0 ) return 0;
int num = 1; // 一定至少移动一次
num += hanoi(n-1,a,c,b);
cout << a << "->" << c << endl;
num += hanoi(n-1,b,a,c);
return num;
}
int main() {
int n;
cin >> n;
int ans = hanoi(n,'A','B','C');
cout << ans << endl;
return 0;
}