递归-汉诺塔

雨燕双飞 提交于 2020-02-26 02:19:11

两个汉诺塔,一个是普通版的,另一个是加上必须经过中间柱子的。

#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;
int ans = 0, n;
long long ans2 = 0;
void hmove(char a, char b, char c, int n){
    if(n == 0){
        return ;
    }
    hmove(a, c, b, n - 1);                     //前n - 1块从a移动到b上
    printf("%c -> %c\n", a, c);                //我自己移动一块从a -> c
    ans++;                                     //我移动了几次?
    hmove(b, a, c, n - 1);                     //最后把 n - 1块从b移动到c上
}

//只能先移动到相邻的柱子上
void hmove2(char a, char b, char c, int n){
    if(n == 0){
        return ;
    }
    hmove2(a, b, c, n - 1);                    //把前n - 1块通过b移动到c上
    ans2++;                                    //把最后一块移动到b上
    printf("%c -> %c\n", a, b);
    hmove2(c, b , a, n - 1);                  //把n - 1 块通过b移动到a上
    ans2++;                                   //把最后一块移动到c上
    printf("%c -> %c\n", b, c);
    hmove2(a, b, c, n - 1);                   //把剩下的n - 1块通过b移动到c上
}

int main(){
    scanf("%d", &n);
    printf("普通汉诺塔\n");
    hmove('a', 'b', 'c', n);
    printf("%d\n", ans);
    printf("本题目汉诺塔\n");
    hmove2('a', 'b', 'c', n);
    printf("%lld\n", ans2);
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!