zoukankan      html  css  js  c++  java
  • Hanoi汉诺塔问题——递归与函数自调用算法

    题目描述 Description

    有N个圆盘,依半径大小(半径都不同),自下而上套在A柱上,每次只允许移动最上面一个盘子到另外的柱子上去(除A柱外,还有B柱和C柱,开始时这两个柱子上无盘子),但绝不允许发生柱子上出现大盘子在上,小盘子在下的情况,现要求设计将A柱子上N个盘子搬移到C柱去的方法。 

    输入输出格式 Input/output
    输入格式:
    一行,n<=20
    输出格式:
    步数及各种圆盘要移动的步骤
    输入输出样例 Sample input/output
    样例测试点#1
    输入样例:
    2
    输出样例:
    1:From A to B
    2:From A to C
    3:From B to C
    样例测试点#2
    输入样例:
    3
    输出样例:
    1:From A to C
    2:From A to B
    3:From C to B
    4:From A to C
    5:From B to A
    6:From B to C
    7:From A to C
    思路:

    本题是典型的递归程序设计题。

        (1)当N=1 时,只有一个盘子,只需要移动一次:A—>C;

        (2)当N=2时,则需要移动三次:

            A------ 1 ------> B, A ------ 2 ------> C, B ------ 1------> C. 

        (3)如果N=3,则具体移动步骤为:

        

    假设把第3步,第4步,第7步抽出来就相当于N=2的情况(把上面2片捆在一起,视为一片):

    所以可按“N=2”的移动步骤设计:

           ①如果N=0,则退出,即结束程序;否则继续往下执行;

           ②用C柱作为协助过渡,将A柱上的(N-1)片移到B柱上,调用过程mov(n-1, a,b,c);

           ③将A柱上剩下的一片直接移到C柱上;

           ④用A柱作为协助过渡,将B柱上的(N-1)移到C柱上,调用过程mov (n-1,b,c,a)

    代码如下:

     1 #include <stdio.h>
     2 int k=0;//统计步数 
     3 void Hanoi(int n,char a,char b,char c)
     4 {    
     5     if(n==0)//0的话,没什么好玩的了,直接退出!! 
     6     {
     7         return ;        
     8     }  
     9     else
    10     {        
    11         Hanoi(n-1,a,c,b);
    12         k++;
    13         printf("%d:From %c to %c
    ",k,a,c);
    14         Hanoi(n-1,b,a,c);
    15     }
    16 }
    17 int main()
    18 {
    19     int n;
    20     scanf("%d",&n);
    21     Hanoi(n,'A','B','C');    
    22     return 0;
    23 }
  • 相关阅读:
    Vue3小知识
    Eslint小知识
    微信小程序注意点
    vue常用方法2
    vue常用方法
    vue组件常用方法
    013 --TypeScript之高级类型
    012--TypeScript之类型推断
    jenkins window unity 控制台输出中文乱码
    Unity 生成 Android App Bundle(aab) (二)
  • 原文地址:https://www.cnblogs.com/geek-007/p/4470075.html
Copyright © 2011-2022 走看看