分治算法解汉诺塔问题

13 篇文章 2 订阅

1 问题描述

设有A、B、C3个塔座。

在这里插入图片描述

在塔座A上有一叠共n个圆盘。自上而下,由小到大地叠在一起,依次编号为1,2,…,n。

问题:要求将塔座A上的圆盘全部移到塔座C上,仍按同样顺序叠置。在移动圆盘时遵守以下规则:

  • 每次只允许移动1个圆盘
  • 任何时刻都不允许将较大的圆盘压在较小的圆盘之上
  • 在规则1和2的前提下,可将圆盘移至任何一塔座上

2 分析

  • 当n=1时,问题可以直接求解,一步完成
  • 当n>1时,分三步完成:
    1. 将n-1个较小盘子设法移动到辅助塔座。
      • 构造出一个比原问题规模小1的问题。
    2. 将最大的盘子从原塔座一步移至目标塔座
    3. 将n-1个较小的盘子设法从辅助塔座移至目标塔座
      • 仍然是比原问题规模小1的问题。

3 C++实现

#include <vector>
#include <cstdio>

void printTower(vector<vector<int>>&tower){
    for(int i=0;i<tower.size();i++){
        printf("第%d个塔: ",i+1);
        for(int j=0;j<tower.at(i).size();j++){
            printf(" %d",tower.at(i).at(j));
        }
        printf("\n");
    }
    printf("\n");
}

void move(vector<vector<int>>&tower,int src,int tar){
    
    tower.at(tar).push_back(tower.at(src).back());
    tower.at(src).pop_back();
    printTower(tower);    
}


void hanoi(vector<vector<int>>&tower,int n,int src,int tar,int aux){
    if(n>0){
        hanoi(tower,n-1,src,aux,tar);
        move(tower,src,tar);
        hanoi(tower,n-1,aux,tar,src);
    }
}

void test1 (){
    vector<vector<int>>tower;
    tower.push_back(vector<int>());
    tower.push_back(vector<int>());
    tower.push_back(vector<int>());
    tower.at(0).push_back(4);
    tower.at(0).push_back(3);
    tower.at(0).push_back(2);
    tower.at(0).push_back(1);

    printTower(tower);
    hanoi(tower,4,0,2,1);
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一朝英雄拔剑起

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值