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
  • 相关阅读:
    太原市圆通快递网点
    快递单号查询小工具
    C#快递单号查询源码
    爱快递快递接口使用说明
    如何把网站及数据库部署到Windows Azure
    从window.console&&console.log(123)浅谈JS的且运算逻辑(&&)
    C# Enum 简易权限设计 使用FlagsAttribute属性
    Lambda 表达式(C# 编程指南)
    C# list使用方法
    SharePoint Server 2013介绍v2
  • 原文地址:https://www.cnblogs.com/datakv/p/5607876.html
Copyright © 2011-2022 走看看