zoukankan      html  css  js  c++  java
  • C++汉诺塔(形象化移动过程)

    文章同步发表于  

    新年倒腾塔(汉诺塔)

    效果图

     头文件代码

    #pragma once
    #ifndef _C_CHAPTER_3_
    
    #include <vector>
    #include <functional>
    
    /*
    * 汉诺塔[A(n)   ->   C]分解为
    *     1.[A(n-1) ->   B]
    *     2.[A(1)   ->   C]
    *     3.[B(n-1) ->   C]
    * 步骤1又可看作是
    * 下一个[A(n)   ->   C]
    *    此时A(n)=A(n-1),C=B
    * 步骤3也可看作是
    * 下一个[A(n)   ->   C]
    *    此时A(n)=B(n-1),C=C
    * 移动次数=2^n - 1
    */
    void Hanoi(int iDish = 0x03);
    void Hanoi_Move(int iDish, std::vector<int>& vecA, std::vector<int>& vecB, std::vector<int>& vecC, int& iSteps, std::function<void(int)> Hanoi_Status_CB);
    void Hanoi_Move(std::vector<int>& vecSrc, std::vector<int>& vecDst, int& iSteps, std::function<void(int)> Hanoi_Status_CB);
    void Hanoi_Status(std::vector<int>& vecA, std::vector<int>& vecB, std::vector<int>& vecC, int iSteps);
    
    #endif // !_C_CHAPTER_3_

    CPP文件实现代码

    #include "Chapter3.h"
    #include <iostream>
    #include <iomanip>
    #include <string>
    
    
    /*
    * 汉诺塔[A(n)   ->   C]分解为
    *     1.[A(n-1) ->   B]
    *     2.[A(1)   ->   C]
    *     3.[B(n-1) ->   C]
    * 步骤1又可看作是
    * 下一个[A(n)   ->   C]
    *    此时A(n)=A(n-1),C=B
    * 步骤3也可看作是
    * 下一个[A(n)   ->   C]
    *    此时A(n)=B(n-1),C=C
    * 移动次数=2^n - 1
    */
    void Hanoi(int iDish)
    {
      //初始化
      std::vector<int> vecA;
      std::vector<int> vecB;
      std::vector<int> vecC;
      for (int i = iDish; i > 0x00; --i)
      {
        vecA.push_back(i);
      }
    
      //步数
      int iSteps = 0x00;
      //状态
      Hanoi_Status(vecA, vecB, vecC, iSteps);
    
      //移动
      Hanoi_Move(iDish, vecA, vecB, vecC, iSteps, [&](int iStep)
      {
        Hanoi_Status(vecA, vecB, vecC, iSteps);
      });
    
    }
    void Hanoi_Move(int iDish, std::vector<int>& vecA, std::vector<int>& vecB, std::vector<int>& vecC, int& iSteps, std::function<void(int)> Hanoi_Status_CB)
    {
      //最后一个
      if (0x01 == iDish)
      {
        Hanoi_Move(vecA, vecC, iSteps, Hanoi_Status_CB);
      }
      else
      {
        Hanoi_Move(iDish - 0x01, vecA, vecC, vecB, iSteps, Hanoi_Status_CB);
        Hanoi_Move(vecA, vecC, iSteps, Hanoi_Status_CB);
        Hanoi_Move(iDish - 0x01, vecB, vecA, vecC, iSteps, Hanoi_Status_CB);
      }
    }
    void Hanoi_Move(std::vector<int>& vecSrc, std::vector<int>& vecDst, int& iSteps, std::function<void(int)> Hanoi_Status_CB)
    {
      //移动
      int iSrc = vecSrc.back();
      vecDst.push_back(iSrc);
      vecSrc.pop_back();
    
      //
      ++iSteps;
      Hanoi_Status_CB(iSteps);
    }
    void Hanoi_Status(std::vector<int>& vecA, std::vector<int>& vecB, std::vector<int>& vecC, int iSteps)
    {
      std::cout << "Steps  =" << std::setw(0x04) << ((0x00 < iSteps) ? std::to_string(iSteps) : "---" )<< std::endl;
      //倒序输出
      size_t ullTotalSize = vecA.size() + vecB.size() + vecC.size();
      for (size_t i = ullTotalSize; i > 0x00; --i)
      {
        std::cout << "  " << std::setw(0x02) << ((i > vecA.size()) ? "|" : std::to_string(vecA[i - 0x01]))
              << "  " << std::setw(0x02) << ((i > vecB.size()) ? "|" : std::to_string(vecB[i - 0x01]))
              << "  " << std::setw(0x02) << ((i > vecC.size()) ? "|" : std::to_string(vecC[i - 0x01]))
              << std::endl;
      }
      std::cout << "   " << "A" << "   " << "B" << "   " << "C" << std::endl;
      std::cout << std::endl;
    }

    Main函数调用代码

    int main()
    {
        //Chapter3
        /**/
        {
            Hanoi(3);
        }
    }

  • 相关阅读:
    新版vscode配置eslint自动格式化代码
    vue cli4 拿到一个项目后
    windows 网页打不开github网站
    PHP+jQuery-ui拖动浮动层排序并保存到数据库实例
    php+html5兼容手机端的图片选取裁剪上传实例
    PHP+MySQL设计高效发表评论留言功能
    5种PHP生成图片验证码实例
    PHP+jPaginate插件制作无刷新分页实例
    PHP+Mysql实现网站顶和踩投票功能实例
    jQuery+PHP实现购物商城常用的星级评分效果
  • 原文地址:https://www.cnblogs.com/wjshan0808/p/15758729.html
Copyright © 2011-2022 走看看