汉诺塔(必须经过中间柱子)递归与非递归详解与代码实现

首先介绍一下汉诺塔最初始的规则:

有三根相邻的柱子,标号为A,B,C,A柱子从上到下按照金字塔状叠放着n个不同大小的圆盘,现在把所有的盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方。


这是最初始的规则,实现的思路可以分为两个步骤:
(假设圆盘期初都在左边的柱子上,想移动到右边的柱子上)
1.如果只有一个圆盘,直接把左边的圆盘移动到右边。
2.如果有n个圆盘(n>1),先把1—n–1圆盘移动到中间的柱子上,最后一个圆盘进行第一个步骤,之后再把1—n-1圆盘从中间移动到右边。
给出一个博文的链接:打开链接,该博主写得简单易懂,十分推荐。


升级规则:不能将圆盘直接从左边移动到右边,必须经过中间的柱子

递归法:

其实思路与升级前的递归是一样的:
1.当只有一个圆盘时,先从左移到中间,再从中间移动到右边。
2.当有两个圆盘时,先把1(最上面的圆盘)从左边移到中间,再把1移动到右边。把2(1圆盘下面的圆盘)从左边移动到中间,然后把1从右边移动到中间,再把1移动到左边,把2从中间移动到右边,把1从左边移动到中间,再移动到右边。
3.……
总结来说我们要做的有两个步骤:
1、当只要一个圆盘时:
1)如果起点或者终点中有一个为中间柱子,直接把圆盘从起始柱子移动到目标柱子。
2)如果起点和终点都不为中间的柱子,则需要两步,首先把圆盘从起始柱子移动到中间柱子,在从中间柱子移动到目标柱子。
2、当有n(n>1)个圆盘时,需要把1—n-1圆盘从左边移动到右边,再将最底下的圆盘n移动到中间,把1—n-1圆盘从右边移动到左边,把圆盘n从中间移动到右边,1—n-1圆盘从左边移动到右边。
代码:

//hannuota II  递归
#include<iostream>
#include<vector>
#include<string>

using namespace std;

/*变量含义
* n:圆盘数量
*left:左柱子
*mid:中间柱子
*right:右柱子
*from:起点柱子
*to:目标柱子
*/
long hannuota(int n,string left,string mid,string right,string from,string to)
{
    if(n == 1)
    {
        if(from == mid||to == mid)
        {
            cout<<"将"<<n<<"从"<<from<<"移动到"<<to<<endl;
            return 1;
        }
        else
        {
            cout<<"将"<<n<<"从"<<from<<"移动到"<<mid<<endl;
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值