位置: 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语言中如何防止函数重名)

  • 华为P50是双5G吗(华为p50是不是5g)

    华为P50是双5G吗(华为p50是不是5g)

  • excel怎么把一列数据设为x轴(excel怎么把一列中的部分内容删除)

    excel怎么把一列数据设为x轴(excel怎么把一列中的部分内容删除)

  • 小米8看视频自动黑屏(小米看视频自动黑屏怎么设置)

    小米8看视频自动黑屏(小米看视频自动黑屏怎么设置)

  • 华为出现绿框下拉不动怎么办(华为出现绿框下载怎么办)

    华为出现绿框下拉不动怎么办(华为出现绿框下载怎么办)

  • 探探被禁言能收到消息吗(探探被禁言了对方能看到你吗)

    探探被禁言能收到消息吗(探探被禁言了对方能看到你吗)

  • gtx770什么水平

    gtx770什么水平

  • qq音乐怎么下载到u盘里播放不了(qq音乐怎么下载到本地文件)

    qq音乐怎么下载到u盘里播放不了(qq音乐怎么下载到本地文件)

  • 手机多媒体突然没有声音了是怎么回事(手机多媒体突然没声音了怎么办?)

    手机多媒体突然没有声音了是怎么回事(手机多媒体突然没声音了怎么办?)

  • outlook无法发送邮件(outlook无法发送邮件,邮件已被服务器拒绝)

    outlook无法发送邮件(outlook无法发送邮件,邮件已被服务器拒绝)

  • 华为mate30悬浮按钮怎么设置(华为mate30悬浮按钮开关在哪里)

    华为mate30悬浮按钮怎么设置(华为mate30悬浮按钮开关在哪里)

  • 为什么苹果手机视频加载不出来(为什么苹果手机日历不显示父亲节)

    为什么苹果手机视频加载不出来(为什么苹果手机日历不显示父亲节)

  • 微信运动一般封多久能恢复(微信运动封面好看的壁纸男)

    微信运动一般封多久能恢复(微信运动封面好看的壁纸男)

  • oppo reno屏幕比例(opporeno6屏幕比例)

    oppo reno屏幕比例(opporeno6屏幕比例)

  • 联想电脑bios恢复出厂设置在哪里(联想电脑bios恢复出厂设置没反应)

    联想电脑bios恢复出厂设置在哪里(联想电脑bios恢复出厂设置没反应)

  • m1903f10a是什么型号(m1903f10g是什么型号)

    m1903f10a是什么型号(m1903f10g是什么型号)

  • 台式电脑怎么看wifi密码(台式电脑怎么看主板型号)

    台式电脑怎么看wifi密码(台式电脑怎么看主板型号)

  • 手机怎么设置微信步数(手机怎么设置微信来信息不显示内容)

    手机怎么设置微信步数(手机怎么设置微信来信息不显示内容)

  • usim卡应用老是跳出来(usim卡应用老是跳出来oppo)

    usim卡应用老是跳出来(usim卡应用老是跳出来oppo)

  • 如何把抖音视频成锁屏(如何把抖音视频发给微信好友)

    如何把抖音视频成锁屏(如何把抖音视频发给微信好友)

  • 什么叫手动双面打印(手动双面是什么意思)

    什么叫手动双面打印(手动双面是什么意思)

  • 手机淘宝如何领金币(手机淘宝怎样领劵)

    手机淘宝如何领金币(手机淘宝怎样领劵)

  • app开发优势(app开发有哪些技术)

    app开发优势(app开发有哪些技术)

  • 微信群如何突破500人限制(微信群如何突破人数限制)

    微信群如何突破500人限制(微信群如何突破人数限制)

  • 惠普笔记本怎么拆(惠普笔记本怎么恢复出厂设置)

    惠普笔记本怎么拆(惠普笔记本怎么恢复出厂设置)

  • 如何使用WPS绘制组织结构图(如何使用wps绘制流程图)

    如何使用WPS绘制组织结构图(如何使用wps绘制流程图)

  • imscinst.exe是什么进程 作用是什么 imscinst进程查询(msoicons.exe是什么文件)

    imscinst.exe是什么进程 作用是什么 imscinst进程查询(msoicons.exe是什么文件)

  • 文心一言 VS ChatGPT,国产大模型和国外的差距有多大?(文心一言 VS ChatGPT)

    文心一言 VS ChatGPT,国产大模型和国外的差距有多大?(文心一言 VS ChatGPT)

  • flex布局之flex-direction(flex布局用法)

    flex布局之flex-direction(flex布局用法)

  • telinit命令  更改系统的运行级别(如何更改telnet端口)

    telinit命令 更改系统的运行级别(如何更改telnet端口)

  • 个人所得税信息采集怎么弄
  • 报税申报不了
  • 管理费用中的办公费占比是多少
  • 出口合同包括哪些条款
  • 出口关税的计算基数
  • 制造费用多结转了下月如何调整
  • 先报个税还是先报增值税,有影响吗?
  • 加油票抬头开错可以更换吗
  • 医院纯收入
  • 固定资产加速折旧税收优惠政策
  • 超范围经营是不是就等于无证经营
  • 设计原始凭证所需内容及步骤
  • 发票如何保存
  • 记载资金的账簿要交印花税吗
  • 低值易耗品费用包括哪些
  • 增值税逾期未申报的税务怎么处理
  • 企业用商业汇票支付购货款
  • 视同销售存货账务处理方法是什么?
  • 银行存款日记账最后一行怎么填
  • 员工扣款个税如何做账
  • 维修费增值税怎么开
  • 母公司向全资子公司增资
  • 房地产企业收到定金 什么时候交增值税 账务处理
  • 实收资本印花税最新政策2023年
  • 资产负债表日后事项是什么意思?
  • 专票当月开的能作废吗
  • 个人投资者
  • 以前的员工怎么交社保
  • 简易征收应纳税额为负数
  • 房地产增值税结转收入的条件是什么
  • 工商年报财务数据怎么填
  • 收到上年度企业所得税退税款
  • ocxdll.exe - ocxdll是什么进程 有什么用
  • php面向对象优点,缺点
  • 跨年度费用应如何计算
  • 创业补贴的作用
  • 若依框架好用吗
  • 整理php防注入和注入
  • 赠送礼品账务处理
  • php格式转换
  • php imagefill
  • 过拟合能不能从根本上解决
  • 增值税发票半年能开吗
  • 发票多开了 财务怎么算税点
  • 模型未来的发展趋势
  • 大模型时代的自然语言处理
  • php正则匹配a标签href
  • phpcms模板制作教程
  • 织梦cms为什么不维护了
  • python中的split函数
  • sqlsever修改数据
  • 预付账款和挂账的区别
  • 需要做审计有哪些行业
  • sql服务如何自动启动
  • 个体户注销工商需要等公示时间结束吗?
  • 零星采购入什么科目
  • 企业哪些进项税不能抵扣
  • 发票冲红重开,重开时是按新税率还是旧税率?
  • 出差补贴如何账务处理
  • 销售过程中发生的商业折扣计入
  • 补缴以前年度企业所得税以及滞纳金
  • 股权投资业务是什么意思
  • 百望开发票
  • 股东将股权转让后是否还承担责任
  • 代扣代缴增值税申报期限
  • 免缴教育费附加什么意思
  • 建账的要点及应注意的问题
  • windows命令行修改密码
  • win 8.1 preview ISO镜像安装方法简易教程
  • win7系统打不开浏览器
  • win7开机黑屏怎么
  • centos6 iptables配置
  • win10 mobile 1709
  • 利用python中的运算符可以编程解决你身边的哪些问题
  • jQuery插件能输出到控制台
  • python内置函数format
  • javascript如何学
  • FileUtils文件工具类
  • 营业执照网上申报入口官网
  • 招投标法实施条例是哪一年修正的
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设