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

    递归实现

    #include <iostream>
    #include <stack>
    
    using namespace std;
    
    #define mvh(s, o)  cout << (s) << "=>" << (o) << endl;
    
    
    void Hanoi(char a, char b, char c, int n)
    {
        if (n < 1)
            return;
        Hanoi(a, c, b, n - 1);
        mvh(a, c)
        Hanoi(b, a, c, n - 1);
    }

    非递归实现

     1 typedef struct HState
     2 {
     3     char a;
     4     char b;
     5     char c;
     6     char flag;
     7     int  n;
     8 } HState;
     9 
    10 //非递归实现
    11 void HanoiNo(char A, char B, char C, int n)
    12 {
    13     stack<HState> HSS;
    14 
    15     HState hs1;
    16     hs1.a = A;
    17     hs1.b = B;
    18     hs1.c = C;
    19     hs1.flag = 0;
    20     hs1.n = n;
    21 
    22     HSS.push(hs1);
    23 
    24     while (!HSS.empty())
    25     {
    26         if (HSS.top().n < 1)
    27         {
    28             HSS.pop();
    29             if (!HSS.empty())
    30                 HSS.top().flag ++;
    31         }
    32         else if (HSS.top().flag == 0)
    33         {
    34             HState hs;
    35             hs.a = HSS.top().a;
    36             hs.b = HSS.top().c;
    37             hs.c = HSS.top().b;
    38             hs.n = HSS.top().n - 1;
    39             hs.flag = 0;
    40             HSS.push(hs);
    41         }
    42         else if (HSS.top().flag == 1)
    43         {
    44             mvh(HSS.top().a, HSS.top().c)
    45             HState hs;
    46             hs.a = HSS.top().b;
    47             hs.b = HSS.top().a;
    48             hs.c = HSS.top().c;
    49             hs.n = HSS.top().n - 1;
    50             hs.flag = 0;
    51             HSS.push(hs);
    52         }
    53         else if (HSS.top().flag == 2)
    54         {
    55             HSS.pop();
    56             if (!HSS.empty())
    57                 HSS.top().flag ++;
    58         }
    59         else
    60         {
    61             cout << "error..." << endl;
    62             break;
    63         }
    64     }
    65 }

    测试

    #include <iostream>
    #include <stack>
    
    using namespace std;
    
    int main()
    {
        HanoiNo('A', 'B', 'C', 15);
        cout << "-------------------------------------"    << endl;
        Hanoi('A', 'B', 'C', 15);
        return 0;
    }
    出自datakv
  • 相关阅读:
    rsync的man手册(未完成)
    rsync基础
    命令:mktemp
    命令:install
    [Abp vNext 源码分析]
    异常吞噬问题一则
    使用 Polly 实现复杂策略(超时重试)
    在 DotNetty 中实现同步请求
    使用 C# 实现 CJ-T188 水表协议和 DL-T645 电表协议的解析与编码
    DevExpress 使用 GridControl 时,数据源无法立即更新的问题
  • 原文地址:https://www.cnblogs.com/datakv/p/5607876.html
Copyright © 2011-2022 走看看