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

原文地址:https://www.cnblogs.com/wjshan0808/p/15758729.html