• 东北林业大 564 汉诺塔


    Problem:564

    Time Limit:1000ms

    Memory Limit:65536K

    Description

    从前有一座庙,庙里有三个柱子,柱A柱 B柱 C。柱A有64个盘子,从上往下盘子越来越大。要求庙里的老和尚把这64个盘子全部移动到柱子C上。移动的时候始终只能小盘子压着大盘子。而且每次只能移动一个。
    现在问题来了,老和尚相知道将柱A上面前n个盘子从柱A搬到柱C搬动方法。要求移动次数最少。
    

    Input

    输入有多组,每组输入一个正整数n(0<n<16)

    Output

    每组测试实例,输出每一步的步骤,输出“number..a..form..b..to..c”。表示将第a个盘子从柱b搬到柱c.

    Sample Input

    2

    Sample Output

    number..1..form..A..to..B
    number..2..form..A..to..C
    number..1..form..B..to..C
    

    这是我接触的第一个汉诺塔的题,在这道题中我真正见识到了递归的伟大。代码没有提交,不知道可不可以AC。

    从第n个开始,将前n-1个看为一个整体进行移动,而对于前n-1个,则可以利用函数的参数的变化对前n-1的移动进行讨论。
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <cstdlib>
    #include <cstdio>
    #define MAX_N   1005
    #define TY  int
    #define MAX(a, b)   ((a > b)? a: b)
    #define MIN(a, b)   ((a < b)? a: b)
    using namespace std;
    
    void move(int n, char a, char b) {
        printf("number..%d..form..%c..to..%c
    ", n, a, b);
    }
    void hanoi(int n, char a, char b, char c) {
        if (n == 1) {
            move(n, a, c);
        }
        else {
            hanoi(n - 1, a, c, b);
            move(n, a, c);
            hanoi(n-1, b, a, c);
        }
    }
    int main() {
        int n;
        while (scanf("%d", &n) != EOF) {
            hanoi(n, 'A', 'B', 'C');
        }
        return 0;
    }
    


  • 相关阅读:
    解决Tomcat请求中文乱码的问题
    Bootstrap 兼容 IE
    Spring+MyBatis多数据源配置实现
    年度总结与计划
    AJAX 提交表单以及文件上传
    移动端Web开发调试工具:Chrome DevTools
    SpringMVC 之 @ResponseBody 和 @RequestBody
    goland快键键防忘
    MySQL日志文件影响数据库的各种类型活动
    何为云计算
  • 原文地址:https://www.cnblogs.com/cniwoq/p/6770935.html
Copyright © 2020-2023  润新知