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

  • 相关阅读:
    Codeforces 834D The Bakery
    hdu 1394 Minimum Inversion Number
    Codeforces 837E Vasya's Function
    Codeforces 837D Round Subset
    Codeforces 825E Minimal Labels
    Codeforces 437D The Child and Zoo
    Codeforces 822D My pretty girl Noora
    Codeforces 799D Field expansion
    Codeforces 438D The Child and Sequence
    Codeforces Round #427 (Div. 2) Problem D Palindromic characteristics (Codeforces 835D)
  • 原文地址:https://www.cnblogs.com/wjshan0808/p/15758729.html
Copyright © 2011-2022 走看看