审题:
本题需要我们找到最优的汉诺塔搬法然后将移动路径输出思路:
方法一:递归我们先分析题目
n为2的情况,我们先将第一个盘子移动到三号柱子上,然后再将二号盘子移动到二号柱子上
n为3的情况,我们先将前面两个盘子移动到三号柱子上,然后再将三号盘子移动到二号柱子上
所以大问题就可以分解为同样的子问题,都是将x柱子上的盘子通过y柱子移动到z柱子上
图示:
第一步:将前面n-1个盘子通过z柱子移动到y柱子上
第二步:将x柱子上的最后一个盘子借助y柱子移动到z柱子上
第三步:将y柱子上的n-1个盘子借助x柱子移动到z柱子上
解题:
#include<iostream> using namespace std; int n; char a, b, c; //x上的n个盘子借助y柱子移动到z柱子上 void func(int n, char x, char y, char z) { //退出条件 if (n == 0) { return; } func(n - 1, x, z, y); printf("%c->%d->%c\n", x, n, z); func(n - 1, y, x, z); } int main() { cin >> n >> a >> b >> c; func(n, a, c, b); return 0; }
递归就是大问题的解决要依靠一模一样的小问题,此时我们就可以通过自己调用自己函数的方式来解决此类问题。
写出递归的方法:
1.给递归函数指定一个功能,并在递归函数调用自身的时候默认他可以实现指定的功能
2.只关注解决一个问题,而不要直接将递归展开思考
3.写出返回条件
信息学奥赛一本通(C++版)在线评测系统