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 }
  • 相关阅读:
    Leetcode 121. Best Time to Buy and Sell Stock
    Leetcode 120. Triangle
    Leetcode 26. Remove Duplicates from Sorted Array
    Leetcode 767. Reorganize String
    Leetcode 6. ZigZag Conversion
    KMP HDU 1686 Oulipo
    多重背包 HDU 2844 Coins
    Line belt 三分嵌套
    三分板子 zoj 3203
    二分板子 poj 3122 pie
  • 原文地址:https://www.cnblogs.com/rabbit1103/p/13931533.html
Copyright © 2011-2022 走看看