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);
        }
    }

  • 相关阅读:
    关于APNs的错误认识纠正
    关于NSParagraphStyle
    关于离开UIScrollview所在界面时,UIScrollview的偏移量发生变化
    关于核心动画的一个提示
    关于PDF展示解决方案
    DQN 强化学习
    什么是 DQN
    面试时应该问面试官什么
    看demo1
    试着用教程跑cifar10数据
  • 原文地址:https://www.cnblogs.com/wjshan0808/p/15758729.html
Copyright © 2011-2022 走看看