zoukankan      html  css  js  c++  java
  • 汉诺塔问题

      汉诺塔问题是使用递归解决问题的经典范例。

      汉诺(Hanoi)塔问题:古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图)。有一个和尚想把这64个盘子从A座移到B座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求打印移动的步骤。如果只有一个盘子,则不需要利用B座,直接将盘子从A移动到C。

    • 如果有2个盘子,可以先将盘子1上的盘子2移动到B;将盘子1移动到c;将盘子2移动到c。这说明了:可以借助B将2个盘子从A移动到C,当然,也可以借助C将2个盘子从A移动到B。
    • 如果有3个盘子,那么根据2个盘子的结论,可以借助c将盘子1上的两个盘子从A移动到B;将盘子1从A移动到C,A变成空座;借助A座,将B上的两个盘子移动到C。这说明:可以借助一个空座,将3个盘子从一个座移动到另一个。
    • 如果有4个盘子,那么首先借助空座C,将盘子1上的三个盘子从A移动到B;将盘子1移动到C,A变成空座;借助空座A,将B座上的三个盘子移动到C。
      代码如下:
    #include <iostream>
    #include
    <stdio.h>
    using namespace std;

    static int step = 0;
    void move ( char sour, char dest )
    {
    printf (
    "move from %c to %c \n", sour, dest );
    }

    void hanoi ( int n, char sour, char temp, char dest )
    {
    if ( n == 1 )
    {
    move ( sour, dest );
    ++step;
    }
    else
    {
    hanoi ( n
    -1, sour, dest, temp );
    move ( sour,dest );
    ++step;
    hanoi ( n
    -1, temp, sour, dest );
    }
    }
    int main ( int argc, char **argv )
    {
    int n = 4;
    hanoi ( n,
    'A', 'B', 'C' );
    printf (
    "Total steps is %d\n", step );
    return 0;
    }

      

      


  • 相关阅读:
    H5 俄罗斯方块Demo
    HTML5 Web Workers
    H5 基于Web Storage 的客户端留言板
    H5 百度一下,你就知道
    H5 71-网易注册界面4
    H5 70-清除浮动方式五
    H5 69-清除浮动方式四
    H5 68-伪元素选择器
    H5 67-清除浮动方式三
    H5 66-清除浮动方式二
  • 原文地址:https://www.cnblogs.com/DanielZheng/p/2146453.html