原题网址:https://www.lintcode.com/problem/mock-hanoi-tower-by-stacks/description

描述

在经典的汉诺塔问题中,有 3 个塔和 N 个可用来堆砌成塔的不同大小的盘子。要求盘子必须按照从小到大的顺序从上往下堆 (如,任意一个盘子,其必须堆在比它大的盘子上面)。同时,你必须满足以下限制条件:

(1) 每次只能移动一个盘子。
(2) 每个盘子从堆的顶部被移动后,只能置放于下一个堆中。
(3) 每个盘子只能放在比它大的盘子上面。

请写一段程序,实现将第一个堆的盘子移动到最后一个堆中。

标签
思路:汉诺塔——经典递归问题。解法可参考:用栈模拟汉诺塔问题-LintCode
简单说来就是如果只有一个盘子需要移动,直接放到目标塔上;如果有n(n>1)个盘子需要移动:
1 先把n-1个盘子移动到缓冲塔上,此时目标塔做缓冲辅助
2 再把最下面的盘子移动到目标塔
3 最后再把这n-1个盘子移动到目标塔,注意此时缓冲塔是最开始的塔(哪个塔为空就用哪个塔做缓冲)
PS:想不通构造函数的参数有啥用……盘子数?好像不是
AC代码:
class Tower {
private:stack<int> disks;
public:/** @param i: An integer from 0 to 2*/Tower(int i) {// create three towers
    }/** @param d: An integer* @return: nothing*/void add(int d) {// Add a disk into this towerif (!disks.empty() && disks.top() <= d) {printf("Error placing disk %d", d);} else {disks.push(d);}}/** @param t: a tower* @return: nothing*/void moveTopTo(Tower &t) {// Move the top disk of this tower to the top of t.int tmp=disks.top();disks.pop();t.add(tmp);}/** @param n: An integer* @param destination: a tower* @param buffer: a tower* @return: nothing*/void moveDisks(int n, Tower &destination, Tower &buffer) {// Move n Disks from this tower to destination by buffer towerif (n<=0){return ;}    if (n==1){moveTopTo(destination);return ;}moveDisks(n-1,buffer,destination);moveTopTo(destination);buffer.moveDisks(n-1,destination,*this);//注意1 最后一个参数是*this,不是buffer,缓冲塔初始盘子数应为空;2 是buffer调用moveDisks,将buffer中的盘子转移;
    }/** @return: Disks*/stack<int> getDisks() {// write your code herereturn disks;}
};/*** Your Tower object will be instantiated and called as such:* vector<Tower> towers;* for (int i = 0; i < 3; i++) towers.push_back(Tower(i));* for (int i = n - 1; i >= 0; i--) towers[0].add(i);* towers[0].moveDisks(n, towers[2], towers[1]);* print towers[0], towers[1], towers[2]
*/

其它参考:

用栈模拟汉诺塔问题

转载于:https://www.cnblogs.com/Tang-tangt/p/9193988.html

227 用栈模拟汉诺塔问题相关推荐

  1. 栈和队列----用栈求解汉诺塔问题

    用栈求解汉诺塔问题 汉诺塔问题比较经典,现在修改一下汉诺塔游戏的规则:规定不能直接从左移动到右,也不能直接从右移动到左,必须经过中柱,求解当塔有N层的时候,打印最优移动过程和最优移动总步数. 可以采用 ...

  2. Python模拟汉诺塔问题移动盘子的过程

    据说古代有一个梵塔,塔内有三个底座A.B.C,A座上有64个盘子,盘子大小不等,大的在下,小的在上.有一个和尚想把这64个盘子从A座移到C座,但每次只能允许移动一个盘子,在移动盘子的过程中可以利用B座 ...

  3. 左神算法:用栈来求解限制后的汉诺塔问题(Java版)

    本题来自左神<程序员面试代码指南>"用栈来求解汉诺塔问题"题目. 题目 限制后的汉诺塔问题如下: 限制不能从最左侧的塔直接移动到最右侧,也不能从最右侧直接移动到最左侧, ...

  4. 汉诺塔递归与非递归实现

    汉诺塔递归与非递归实现 背景介绍 汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64 ...

  5. 个盘子的汉诺塔需要移动几步_看漫画学C++039:递归解汉诺塔

    点击蓝字 关注我们 本话内容 请输入 相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏.该游戏是在一块铜板装置上,有三根杆(编号A.B.C),在A杆自下而上.由大到小按顺序放置64个金盘(如 ...

  6. 使用Python查看汉诺塔移动详细过程

    汉诺塔属于比较经典的问题,详见以前的文章Python模拟汉诺塔问题移动盘子的过程,基于非递归算法的汉诺塔游戏之Python实现. 本文代码功能:模拟移动汉诺塔上的盘子,并实时显示3根柱子上盘子的情况. ...

  7. 汉诺塔递归的c语言实现(递归)

    对于递归来讲, 汉诺塔实际是经典到不能再经典的例子了,   每个数据结构的教材对会提到. 但是到最后只给出一段类似下面的一段代码: #include<stdio.h>void move(i ...

  8. 栈与队列5——汉诺塔问题(方案二)

    题目 汉诺塔问题的基础上,增加限制,必须得经过中间,不能直接从左到右或从右到左,求当塔有N层的时候打印最优移动过程和最优移动总步数 要求 法一:递归法 法二:非递归法,用栈来模拟 解析 法二:非递归法 ...

  9. 栈与队列5——汉诺塔问题

    题目 汉诺塔问题的基础上,增加限制,必须得经过中间,不能直接从左到右或从右到左,求当塔有N层的时候打印最优移动过程和最优移动总步数. 要求 法一:递归法 法二:非递归法,用栈来模拟 解析 法一:主要分 ...

最新文章

  1. apache php wordpress,windows 安装 apache php wordpress
  2. python知识:*args 和**kwargs
  3. C++primer :const限定符
  4. 【机器学习】数据挖掘实战:金融贷款分类模型和时间序列分析
  5. fastJson去掉指定字段
  6. index加载显示servlet数据_[WEB篇]-JavaWeb基础与应用-02-Servlet开发
  7. 数据科学家需要掌握的10项统计技术,快来测一测吧
  8. 解决python中TypeError: not enough arguments for format string
  9. Sharding-Proxy安装_以及_sharding-proxy自动分表配置_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记019
  10. java系列4:数组的默认值
  11. ubuntu安装jdk6
  12. Java中IO流有哪些
  13. python语言保留字有true吗_python语言的保留字
  14. JavaScript之继承和原型
  15. SonarQube的安装部署过程中踩过的坑
  16. 选择使用Yarn来做Docker的调度引擎
  17. 好看的网站发布导航页HTML源码
  18. 网络线缆连接器和线槽
  19. 电影▍更多的《复仇者联盟4:终局之战》剧透描述了令人心碎的超级英雄死亡...
  20. AI人工智能毕业设计课题:怀旧照片网站,黑白图像图片上色系统

热门文章

  1. php单元格字体颜色,PHPExcel API接口用法大全,按模板导入excel,美化excel,导出图片,设置单元格字体颜色背景色边框,合并单元格,设置行高列宽...
  2. dual vector space
  3. 森林病虫害高光谱遥感监测的研究进展
  4. Canvas 超详细
  5. oracle 10g 配置asm,在Oracle Linux 4.7上安装配置Oracle 10g ASM数据库
  6. 如何以用户身份登录MySQL_解析:如何以普通用户的身份运行 MySQL
  7. java cookie共享_cookie共享
  8. 文本分类器,可自由加载BERT、Bert-wwm、Roberta、ALBert以及ERNIE1.0
  9. 基于知识图谱的问答系统,BERT做命名实体识别和句子相似度
  10. 南开100题计算机三级网络技术,计算机三级网络技术上机南开100题T46-50 -.pdf