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

  • RESET是什么按键

    RESET是什么按键

  • 华硕笔记本怎么连接wifi上网(华硕笔记本怎么进入bios)

    华硕笔记本怎么连接wifi上网(华硕笔记本怎么进入bios)

  • 支付宝下面的生活怎么去掉(支付宝下面生活怎么关闭)

    支付宝下面的生活怎么去掉(支付宝下面生活怎么关闭)

  • 荣耀x10max卡槽的位置在哪里(荣耀x10maxnm卡)

    荣耀x10max卡槽的位置在哪里(荣耀x10maxnm卡)

  • 为什么微信号无故被注销(为什么微信号无法绑定QQ号)

    为什么微信号无故被注销(为什么微信号无法绑定QQ号)

  • 作为垃圾信息送达对方能看到吗(作为垃圾信息送达对方是被拉黑了吗)

    作为垃圾信息送达对方能看到吗(作为垃圾信息送达对方是被拉黑了吗)

  • b站如何举报违规视频(b站app怎么举报)

    b站如何举报违规视频(b站app怎么举报)

  • 软件系统中最重要的是什么(软件系统中最重要的组成部分)

    软件系统中最重要的是什么(软件系统中最重要的组成部分)

  • 语音怎样转发给微信好友(语音怎样转发给别人QQ)

    语音怎样转发给微信好友(语音怎样转发给别人QQ)

  • 小米摄像头换了wifi怎么设置(小米摄像头换了wifi怎么重新连接)

    小米摄像头换了wifi怎么设置(小米摄像头换了wifi怎么重新连接)

  • 苹果官网可以催促加急发货吗(苹果官网可以催促加急退款吗)

    苹果官网可以催促加急发货吗(苹果官网可以催促加急退款吗)

  • apple id更新设置是什么意思(appleid更新设置继续无反应)

    apple id更新设置是什么意思(appleid更新设置继续无反应)

  • 微信能不能隐藏好友又可以正常联系的方法(微信能不能隐藏群聊)

    微信能不能隐藏好友又可以正常联系的方法(微信能不能隐藏群聊)

  • 美团优选是什么意思(美团优选是什么情况)

    美团优选是什么意思(美团优选是什么情况)

  • 关机时的未接来电开机后会显示吗(关机时的未接来电开机后 怎么察)

    关机时的未接来电开机后会显示吗(关机时的未接来电开机后 怎么察)

  • opporeno3是不是5g手机(OPPOReno3是不是快充)

    opporeno3是不是5g手机(OPPOReno3是不是快充)

  • 华为手机进水后黑屏怎么办(华为手机进水后sim卡无服务)

    华为手机进水后黑屏怎么办(华为手机进水后sim卡无服务)

  • 手机qq怎么打卡(qq里面打卡如何在qq里面打卡)

    手机qq怎么打卡(qq里面打卡如何在qq里面打卡)

  • 手机号被360标注怎么取消(手机号被360标注成骚扰电话,怎么去掉)

    手机号被360标注怎么取消(手机号被360标注成骚扰电话,怎么去掉)

  • 华为手机能不能定位别人位置(华为手机能不能下载空调遥控器)

    华为手机能不能定位别人位置(华为手机能不能下载空调遥控器)

  • 手机怎么开热点给别人用(华为手机怎么开热点)

    手机怎么开热点给别人用(华为手机怎么开热点)

  • iphonex几核处理器(苹果x处理器几核)

    iphonex几核处理器(苹果x处理器几核)

  • 如何打开vt(联想如何打开vt)

    如何打开vt(联想如何打开vt)

  • 503错误(503错误的原因和解决方法)

    503错误(503错误的原因和解决方法)

  • 停在同一朵花上的两只金凤蝶 (© Alberto Ghizzi Panizza/Getty Images)(停在花朵上,好像在认真的听同学们读课文修改病句)

    停在同一朵花上的两只金凤蝶 (© Alberto Ghizzi Panizza/Getty Images)(停在花朵上,好像在认真的听同学们读课文修改病句)

  • 未达起征点增值税申报表怎么填
  • 微企怎么申请补贴
  • 无息贴息贷款合同印花税
  • 培训费没有发票怎么办
  • 年底计提费用和实际费用
  • 企业所得税季报营业收入,营业成本怎么填
  • 自然人增值税免税额
  • 保险营销员的佣金怎么算个税
  • 印花税这个月没交下个月补报可以吗?
  • 开票不走公户
  • 金税盘怎么开红字发票流程
  • 企业注销时留抵税额怎么做账
  • 开发商开临时发票
  • 规范合同签订的重要性
  • 外地预缴的企业所得税可以退吗
  • 个税手续费需要开具发票吗
  • 以前年度损益调整贷方余额表示什么
  • 转出多交增值税会计科目
  • 土地出让金返还流程
  • 不征税发票的12个税种
  • 委托代理出口能否办理退税
  • 鸿蒙系统字体不太好看
  • 企业收到财政资金
  • 运输公司的进项必须是专票吗
  • 其他应收款贷方表示什么
  • 2019年下半年中小学教师资格考试综合素质试题
  • 怀特霍尔
  • 怎么开通公众号微信公众平台
  • 布鲁克斯岭
  • laravel实现登录注册
  • 无票收入怎么计算1%税率
  • php获取客户端唯一标识
  • uni-swiper-dot
  • 公司汽车折旧计算方法用那种
  • openai发布企业版
  • 公司之间借款利息需要开票吗
  • python输入三科成绩
  • 销售货物免税
  • 织梦cms要钱吗
  • 汽车修理厂利润
  • 小规模纳税人营业额
  • 个人所得税申报退税能退多少
  • 进口葡萄酒政策
  • 出售金融商品的增值税计税依据
  • 无法支付的应付账款摘要怎么写
  • 为什么当月增加的无形资产当月摊销
  • 押金退还需要多久
  • 单据 凭证
  • 可供分配利润的计算公式
  • 事业单位差旅费报销标准
  • 没有认证的进项发票可以做成本吗
  • 企业免征税范围有哪些
  • 建账基本要求
  • mysql5.7卸载重装
  • Windows7/2008中批量删除隧道适配器的方法
  • win8.1无法连接无线网
  • win10edge浏览器默认主页网址
  • Linux设置jdk环境变量配置
  • 映泰重装系统按什么
  • win8 net framework
  • win10用浏览器
  • win10 edge浏览器怎样添加信任站点
  • linux生成网卡配置文件
  • 文本左右对齐排版怎么弄
  • 在vue中添加按钮使内容消失
  • macos如何使用
  • linux bash脚本
  • unity3d官方案例
  • unity网格地形
  • node js 前端
  • 置顶语句子
  • unity_jail
  • 结婚日课实例讲解
  • android内存占用分析
  • java dom解析
  • 河南省教育厅纪检组举报电话
  • 代理记账公司账务处理
  • 暂估收入入账冲回如何会计分录
  • 控件未安装或控件版本过低
  • 退契税的时间是什么时候
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设