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 }
  • 相关阅读:
    【转】JSON.parse() Unexpected token i in JSON at position 2 报错问题
    修改json对象的每一个值
    浏览器各个版本和系统(chrome/safari/edge/qq/360)
    数据库书籍推荐排行榜
    git-将dev代码合并到test
    npm install报错
    slice()和splice()区别
    在Eclipse中使用JUnit4进行单元测试(初级篇)
    [转载]Jmeter那点事·ForEach和If控制器
    java语言写文件内容
  • 原文地址:https://www.cnblogs.com/rabbit1103/p/13931533.html
Copyright © 2011-2022 走看看