• Hanoi汉诺塔问题


    问题描述

     输入格式

     输出格式

     样例输入

    3

    样例输出

    A--->C

    A--->B

    C--->B

    A--->C

    B--->A

    B--->C

    A--->C

    题解

    当n=1时,移动步骤为

        A--->C

    当n=2时,移动步骤为

        A--->B

        A--->C

        B--->C

    当n=3时,移动步骤为

        A--->C

        A--->B

        C--->B

        A--->C

        B--->A

        B--->C

        A--->C

    我们先把A座上的圆盘从上到下编号

    观察以上三种情况,当我们想把A座上从上往下第i个圆盘移到C座上时,我们可以先把前i-1个圆盘移到B座上,然后把第i个圆盘移到C座上,再把B座上所有圆盘移到C座上

    而前i-1个圆盘从A座移到B座的过程,和前i个圆盘从A座移到C座的过程类似,都是把一堆圆盘从一根柱子移到另一根柱子,且保证所有圆盘的相对位置在移动前后保持不变

    我们把前i-1个圆盘从A座移到B座,可以先把前i-2个圆盘移到C座,然后把第i-1个圆盘移到B座,再把前i-2个圆盘移到B座

    把前i-2个圆盘移到C座,可以先把前i-3个圆盘移到B座,然后把第i-2个圆盘移到C座,再把前i-3个圆盘移到C座

    ……

    于是我们考虑递归

    我们定义一个函数hanoi(int n,char a,char b,char c),表示把前n个圆盘按上述步骤从a座移到c座(a,b,c用于存储三根柱子的编号,其中a的值可能为’A’,’B’,’C’;b,c也是)

    如果当前A座上只剩1个圆盘,直接移到C座上并打印路径

    否则,先把前n-1个圆盘移到b座,即hanoi(n-1,a,c,b),然后把第n个圆盘从a座移到c座(打印路径),再把前n-1个圆盘从b座移到c座,即hanoi(n-1,b,a,c)

     1 #include <stdio.h>
     2 
     3 void hanoi(int n,char a,char b,char c)
     4 {
     5     if (n==1) printf("%c--->%c
    ",a,c);
     6     else
     7     {
     8         hanoi(n-1,a,c,b);
     9         printf("%c--->%c
    ",a,c);
    10         hanoi(n-1,b,a,c);
    11     }
    12     return;
    13 }
    14 
    15 int  main()
    16 {
    17     int n;
    18     scanf("%d", &n);
    19     hanoi(n, 'A', 'B', 'C');
    20     return 0;
    21 }
  • 相关阅读:
    C# 实现 JAVA AES加密解密(转他人)
    转 Java、C#双语版配套AES加解密示例
    开发工具资料
    WebApi返回Json格式
    【转】NuGet.org 无法访问的解决方法
    使用Senparc.Weixin.WxOpen开发高可用的微信小程序
    WebApi资料
    WinForm资料
    Winform开发框架之终极应用
    Winform开发中另一种样式的OutLookBar工具条
  • 原文地址:https://www.cnblogs.com/rabbit1103/p/13931533.html
Copyright © 2020-2023  润新知