位置: IT常识 - 正文

汉诺塔问题分治求解(汉诺塔问题动画演示)

编辑:rootadmin
汉诺塔问题 在经典汉诺塔问题中,有 3 根柱子及 n 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制: (1) 每次只能移动一个盘子; (2) 盘子只能从柱子顶端滑出移到下一根柱子; ( ... 汉诺塔问题

推荐整理分享汉诺塔问题分治求解(汉诺塔问题动画演示),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:汉诺塔问题解析,汉诺塔问题解析,汉诺塔问题的最佳解决方案,汉诺塔问题总结,汉诺塔问题总结,汉诺塔问题的解决方法,汉诺塔问题分析,汉诺塔问题分析,内容如对您有帮助,希望把文章链接给更多的朋友!

在经典汉诺塔问题中,有 3 根柱子及 n 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制:(1) 每次只能移动一个盘子;(2) 盘子只能从柱子顶端滑出移到下一根柱子;(3) 盘子只能叠在比它大的盘子上。

请编写程序,用栈将所有盘子从第一根柱子移到最后一根柱子。

你需要原地修改栈。

输入:A = [2, 1, 0], B = [], C = []输出:C = [2, 1, 0]

解题思路:递归与分治这是一道递归方法的经典题目,乍一想还挺难理清头绪的,我们不妨先从简单的入手。

假设 n = 1,只有一个盘子,很简单,直接把它从 A 中拿出来,移到 C 上;

如果 n = 2 呢?这时候我们就要借助 B 了,因为小盘子必须时刻都在大盘子上面,共需要 4 步。

汉诺塔问题分治求解(汉诺塔问题动画演示)

如果 n > 2 呢?思路和上面是一样的,我们把 n 个盘子也看成两个部分,一部分有 1 个盘子,另一部分有 n - 1 个盘子。

观察上图,你可能会问:“那 n - 1 个盘子是怎么从 A 移到 C 的呢?”

当你在思考这个问题的时候,就将最初的 n 个盘子从 A 移到 C 的问题,转化成了将 n - 1 个盘子从 A 移到 C 的问题, 依次类推,直至转化成 1 个盘子的问题时,问题也就解决了。这就是分治的思想。

而实现分治思想的常用方法就是递归。不难发现,如果原问题可以分解成若干个与原问题结构相同但规模较小的子问题时,往往可以用递归的方法解决。具体解决办法如下:

n = 1 时,直接把盘子从 A 移到 C;

n > 1 时,

先把上面 n - 1 个盘子从 A 移到 B(子问题,递归);

再将最大的盘子从 A 移到 C;

再将 B 上 n - 1 个盘子从 B 移到 C(子问题,递归)。

Java代码class Solution { public void hanota(List<Integer> A, List<Integer> B, List<Integer> C) { /* 1.先将A柱子中的n-1个的圆盘移动到B柱子 2.再将A柱子中最后1个圆盘移动到C柱子 3.最后将B柱子的n-1个圆盘移动到C柱子 */ int n = A.size(); move(n, A, B, C); } /* 其中A为原始柱子;B为辅助柱子;C为目标柱子(与位置有关,那么list都有可能) */ private void move(int n, List<Integer> A, List<Integer> B, List<Integer> C) { // A中只剩下1个圆盘了,直接移动到C柱子后结束 if (n == 1) { C.add(A.remove(A.size() - 1));// 将A柱子中最后1个圆盘移动到C柱子 return; } // 1.先将的A柱子中的n-1个的圆盘移动到B柱子(此时B为目标柱子,A为原始柱子) move(n - 1, A, C, B); // 2.再将的A柱子中最后1个圆盘移动到C柱子 C.add(A.remove(A.size() - 1)); // 3.最后将B柱子的n-1个圆盘移动到C柱子(此时C为目标柱子,B为原始柱子) move(n - 1, B, A, C); }}C++代码class Solution {public: void hanota(vector<int>& A, vector<int>& B, vector<int>& C) { int n = A.size(); move(n, A, B, C); } void move(int n, vector<int>& A, vector<int>& B, vector<int>& C){ if (n == 1){ C.push_back(A.back()); A.pop_back(); return; } move(n-1, A, C, B); // 将A上面n-1个通过C移到B C.push_back(A.back()); // 将A最后一个移到C A.pop_back(); // 这时,A空了 move(n-1, B, A, C); // 将B上面n-1个通过空的A移到C }};复杂度分析时间复杂度:O(2^n-1)。一共需要移动的次数。空间复杂度:O(1)。
本文链接地址:https://www.jiuchutong.com/zhishi/311789.html 转载请保留说明!

上一篇:dedecms织梦Tag标签伪静态设置方法(织梦网站特有标识)

下一篇:c语言中如何防止数组下标越界(c语言中如何防止函数重名)

  • 苹果13pro像素多少万(iphone13pro照片像素)

    苹果13pro像素多少万(iphone13pro照片像素)

  • wps字体颜色怎么改(wps字体颜色怎么改不了)

    wps字体颜色怎么改(wps字体颜色怎么改不了)

  • 拼多多砍价老是出0(拼多多砍价老是砍到免单秘籍)

    拼多多砍价老是出0(拼多多砍价老是砍到免单秘籍)

  • 抖音集卡做更多任务是什么意思(抖音集卡规则说明)

    抖音集卡做更多任务是什么意思(抖音集卡规则说明)

  • 微信怎么发大于100m的视频(微信怎么发大于200兆的文件)

    微信怎么发大于100m的视频(微信怎么发大于200兆的文件)

  • 打对方电话一直占线(拨打对方电话总是说忙)

    打对方电话一直占线(拨打对方电话总是说忙)

  • 电脑照片重命名怎么弄(电脑照片重命名显示在照片上)

    电脑照片重命名怎么弄(电脑照片重命名显示在照片上)

  • 手机wps繁体转简体怎么弄(手机wps繁体转简体不见了)

    手机wps繁体转简体怎么弄(手机wps繁体转简体不见了)

  • lbp2900打印机端口错误(lbp2900打印机端口怎么设置)

    lbp2900打印机端口错误(lbp2900打印机端口怎么设置)

  • 腾讯qq是哪一年出来的(腾讯qq是哪一年上市的)

    腾讯qq是哪一年出来的(腾讯qq是哪一年上市的)

  • mate30扬声器杂音(mate30扬声器杂音 堵住)

    mate30扬声器杂音(mate30扬声器杂音 堵住)

  • 微信如何发布视频号(微信如何发布视频到朋友圈)

    微信如何发布视频号(微信如何发布视频到朋友圈)

  • byte和bit的区别(bit和byte的含义)

    byte和bit的区别(bit和byte的含义)

  • 抖音已重置多久解封(抖音已重置多久可以登录)

    抖音已重置多久解封(抖音已重置多久可以登录)

  • 不是5g手机能用5g套餐吗(不是5G手机能用5G吗)

    不是5g手机能用5g套餐吗(不是5G手机能用5G吗)

  • qq回执编号在哪里输入(qq回执编号在哪里用)

    qq回执编号在哪里输入(qq回执编号在哪里用)

  • 手机很久没用充不进电怎么办(手机很久没用充电很慢怎么回事)

    手机很久没用充不进电怎么办(手机很久没用充电很慢怎么回事)

  • 荣耀9xpro有没有nfc(荣耀80配置参数)

    荣耀9xpro有没有nfc(荣耀80配置参数)

  • 电脑pin码是什么(电脑pin码是什么密码)

    电脑pin码是什么(电脑pin码是什么密码)

  • 为什么qq安装不了(为什么QQ安装不了应用)

    为什么qq安装不了(为什么QQ安装不了应用)

  • 电脑一键还原按f几(电脑一键还原按哪个键win7)

    电脑一键还原按f几(电脑一键还原按哪个键win7)

  • 怎样找回误删的照片(怎样找回误删的微信聊天记录)

    怎样找回误删的照片(怎样找回误删的微信聊天记录)

  • 手环屏幕划伤如何修复(手环屏幕划伤如何修复好)

    手环屏幕划伤如何修复(手环屏幕划伤如何修复好)

  • CAD怎么导入图片格式(2023cad怎么导入图片)

    CAD怎么导入图片格式(2023cad怎么导入图片)

  • 备用金突然被关闭了(备用金突然被关最慢多久恢复)

    备用金突然被关闭了(备用金突然被关最慢多久恢复)

  • 您好您拨打的电话正在通话中(您好您拨打的电话正在通话中请稍后再拨)

    您好您拨打的电话正在通话中(您好您拨打的电话正在通话中请稍后再拨)

  • 丢失增值税专用发票最新规定
  • 私营独资企业交个税还是企税
  • 公司首次申报个税怎么填
  • 冲减计提
  • 税法基本原则是什么意思
  • 收款金额比开票金额少是对方扣的手续费
  • 公司向个人借款不还如何处理
  • 土地增值税清算方法与技巧
  • 小规模建筑业如何做账
  • 建立明细账的注意事项
  • 员工上下班交通安全培训
  • 扣员工工会会费
  • 不含税劳务报酬怎么交税的
  • 银行收取代发工资合法吗
  • 房地产开发预提费用
  • 小规模纳税人网上申报税务操作流程
  • 销项税没有进项税多
  • 单位购买的团体意外险会计分录
  • 食堂费用计入应付职工薪酬吗
  • 文化事业建设税计算方法
  • 长期待摊费用账户按用途和结构分类应属于
  • 事业单位计提折旧的有哪些
  • 咨询费如何入账
  • 总分类账的账簿启用表怎么填
  • 借款支付工程款合法吗
  • 企业捐赠扣除
  • 税收征管法实施细则 不予加收滞纳金
  • 增值税专用发票的税率是多少啊
  • linux基本命令有哪些
  • 应收账款周转天数减少说明什么
  • 人际关系定义是什么
  • php设计思路
  • eclipse中创建webgis项目
  • thinkphp技术
  • 微前端的好处和缺陷
  • 控制系统动力学
  • 前端微信小程序支付功能怎么实现
  • uniapp开发微信小程序怎么样
  • service iptables save
  • java代理类是什么
  • 企业报废原材料如何处理
  • 将织梦dedecms转换到wordpress
  • 房屋租赁费需要分摊吗
  • 期权权利金的计算公式
  • 劳务外经证预缴税款
  • 月底留抵税额需要结转吗
  • 向非关联企业捐赠现金
  • 企业所得税汇算清缴时间
  • 固定资产清理账户期末有余额吗
  • 贷款的拨备覆盖率
  • 应收账款有什么
  • 权益性无形资产包括哪些?
  • 预付卡开不征税发票
  • 小规模纳税人季报网上申报流程
  • 全资子公司的利与弊
  • 计提资产减值准备会计科目
  • 房地产企业成本控制存在的问题及对策
  • 记账凭证种类介绍
  • mysql 数据库
  • mysql如何修改默认值
  • oracle分区大小建议
  • win7旗舰版系统激活码
  • win8 photoshop
  • windows server 2008 r2激活密钥
  • 清华同方bios通用密码(thtfpc)
  • win7移动硬盘无法弹出
  • centos怎么编写c语言
  • win10每次开机提示硬件设置已更改
  • win8系统笔记本怎么恢复出厂设置
  • cocos2d-x教程
  • windows安装node.js
  • 塔防类的网游
  • shell脚本批处理
  • jquery移动节点的方法
  • js对象属性值
  • Python连接MySQL并使用fetchall()方法过滤特殊字符
  • javascript原型链详解
  • ajax 分页
  • 增值税纳税申报时间
  • 成都市地方税务局官网
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设