• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
wjshan0808

Learn from yesterday, Live for today, For a better tomorrow.
 ————wjshan0808

博客园    首页    新随笔    联系   管理    订阅  订阅

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

 


posted @ 2022-01-02 23:29  wjshan0808  阅读(213)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3