zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    静态函数的访问修饰符的问题
    DropDownList 控件控制Image控件动态显示图像
    使用网页对话框来显示图片 window.open()
    用Response.Redirect()方法进行页面的传值
    XML DTD文档定义语法汇总
    json字符串片段转换成HTML片段字符串的问题
    细数改善WPF应用程序性能的10大方法(转)
    C#递归算法-遍历XML文件,以UL列表显示树形结构目录
    我的博客园
    CSDN,让我暴得好彻底......
  • 原文地址:https://www.cnblogs.com/rabbit1103/p/13931533.html
Copyright © 2011-2022 走看看