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

  • 钉钉电脑怎么退出(钉钉电脑怎么退出自动登录)

    钉钉电脑怎么退出(钉钉电脑怎么退出自动登录)

  • WPS在引用中制作目录是什么(wps 引用)

    WPS在引用中制作目录是什么(wps 引用)

  • 华为手机怎么截屏快捷(华为手机怎么截长图 操作方法)

    华为手机怎么截屏快捷(华为手机怎么截长图 操作方法)

  • 华为nova6红外线功能怎么使用(华为nova6红外线在哪)

    华为nova6红外线功能怎么使用(华为nova6红外线在哪)

  • 怎么查找已经刷过的抖音视频(怎么查找已经刷过的抖音直播视频)

    怎么查找已经刷过的抖音视频(怎么查找已经刷过的抖音直播视频)

  • 通话中断是对方挂了吗(通话中断对方知道吗)

    通话中断是对方挂了吗(通话中断对方知道吗)

  • 1+8手机是什么牌子(1+8手机是哪个国家的)

    1+8手机是什么牌子(1+8手机是哪个国家的)

  • iphone7plus处理器是a几(iphone7plus处理器跟骁龙什么差不多)

    iphone7plus处理器是a几(iphone7plus处理器跟骁龙什么差不多)

  • 闲鱼封永久重新注册(闲鱼封永久还能解封吗)

    闲鱼封永久重新注册(闲鱼封永久还能解封吗)

  • a57支持多大内存卡(oppoa57支持多大的内存卡)

    a57支持多大内存卡(oppoa57支持多大的内存卡)

  • 微信授权登录可以获取哪些信息(微信授权登录会有风险吗)

    微信授权登录可以获取哪些信息(微信授权登录会有风险吗)

  • 早期计算机用来干什么(早期计算机主要用来)

    早期计算机用来干什么(早期计算机主要用来)

  • win在键盘上是哪个键(win键盘上是哪个按键)

    win在键盘上是哪个键(win键盘上是哪个按键)

  • 怎样把电影下载到u盘里面(怎样把电影下载到内存卡上)

    怎样把电影下载到u盘里面(怎样把电影下载到内存卡上)

  • 小米9pro公交卡怎么用(小米9公交卡怎么唤出)

    小米9pro公交卡怎么用(小米9公交卡怎么唤出)

  • honor7x是不是双卡(honor7x是不是双卡双待)

    honor7x是不是双卡(honor7x是不是双卡双待)

  • 抖音注销后粉丝还在吗(抖音注销后粉丝还能看到我吗)

    抖音注销后粉丝还在吗(抖音注销后粉丝还能看到我吗)

  • 苹果xsmax nfc怎么使用(苹果xsmaxnfc怎么打卡)

    苹果xsmax nfc怎么使用(苹果xsmaxnfc怎么打卡)

  • 美团外卖豆在哪儿查看(美团豆在哪里)

    美团外卖豆在哪儿查看(美团豆在哪里)

  • 蓝牙耳机红蓝交替闪烁怎么回事(蓝牙耳机红蓝交替闪烁是什么状态)

    蓝牙耳机红蓝交替闪烁怎么回事(蓝牙耳机红蓝交替闪烁是什么状态)

  • 蒙版怎么用(矢量蒙版怎么用)

    蒙版怎么用(矢量蒙版怎么用)

  • 相册不小心删除了怎么复原(相册不小心删除了怎么办)

    相册不小心删除了怎么复原(相册不小心删除了怎么办)

  • 万能钥匙新闻资讯怎么关闭(wⅰf1万能钥匙下载 新闻)

    万能钥匙新闻资讯怎么关闭(wⅰf1万能钥匙下载 新闻)

  • 小米9 6+128和8+128区别(小米9 8+128和6+128哪个好)

    小米9 6+128和8+128区别(小米9 8+128和6+128哪个好)

  • 腾讯电脑管家病毒查杀有什么作用?(腾讯电脑管家病毒库更新)

    腾讯电脑管家病毒查杀有什么作用?(腾讯电脑管家病毒库更新)

  • 如何解决Win7系统设置了自动睡眠但又自动恢复到默认禁用?(如何解决win7系统蓝牙接收模块影响电脑蓝屏)

    如何解决Win7系统设置了自动睡眠但又自动恢复到默认禁用?(如何解决win7系统蓝牙接收模块影响电脑蓝屏)

  • Windows安装Stable Diffusion WebUI及问题解决记录(windows安装无法继续,若要安装请重新启动)

    Windows安装Stable Diffusion WebUI及问题解决记录(windows安装无法继续,若要安装请重新启动)

  • JavaScript详解(javascriptjs)

    JavaScript详解(javascriptjs)

  • 新公司个税申报怎么操作
  • 怎样注册投资有限公司
  • 个人住房交不交个税
  • 小企业一定要买五险吗
  • 个体户银行开户是开公户还是私户
  • 利润表没有资产减值损失这一栏,需要增加吗
  • 加计扣除和研发费不一致
  • 红冲后的发票税可以办退税吗
  • 抵押住房属于
  • 出售商品取得的收入300万元存入银行
  • 机动车临时号牌有效期多久
  • 将外购货物分配给客户
  • 私立医院增值税税率是多少
  • 通用机打发票上没有税率
  • 纸巾可以开专票吗
  • 17%和6%的票能直接抵扣吗?
  • 股权收益需要缴增值税吗
  • 因为担保被起诉怎么办
  • win10取消登陆密码
  • 跨年度增值税发票作废怎么退税
  • 在window操作系统中
  • 事业编党费如何核算
  • 如何删除驱动器里面的文件
  • php删除数组中的某个值
  • 对违规送礼行为怎么处理
  • 购买性支出和转移性支出的本质区别
  • 使用的英文
  • 供货商倒闭未缴增值税
  • zend framework手册
  • php artisan key:generate
  • 会计月报表怎么做表格
  • php求日期差
  • vue中的icon
  • php判断包含指定内容
  • 应收账款的平均余额怎么计算
  • 税务发票红字发票怎么开
  • phpcms生成html
  • 免税农产品发票怎么抵扣申报
  • 深圳增值税普通发票和专用发票的区别
  • 企业固定资产折旧可以按照其价值和使用情况
  • 货物或应税劳务名称怎么填
  • 房产税城镇土地使用税申报期限
  • 应税服务零税率是什么
  • 厂房监理要点
  • 订单式生产的企业有哪些
  • 基金申购费的会计分录
  • 在记账过程中,可能发生各种各样的差错
  • 公司申报的工资和实际发放的工资不一样怎么办
  • 商场收租户电费会计分录
  • 收到上月已付款的材料
  • 农产品收购发票如何抵扣进项税
  • 缴纳社保记账凭证怎么开
  • 票折费用是什么意思
  • 厂家给的促销费可以退吗
  • 收缩后对数据库有影响吗
  • Linux(Ubuntu)下Mysql5.6.28安装配置方法图文教程
  • linux终端记录
  • 系统问题怎么处理
  • win10系统怎么设置开机密码
  • win7系统cmd命令大全
  • win10预览版21337
  • xp系统能用谷歌吗
  • 显示隐藏文件也看不到
  • xp系统新建用户后原来的用户没有了
  • rapapp.exe - rapapp是什么进程 有何作用
  • Win7系统打开D盘文件后怎么没有后退箭头
  • win7电脑flash安装教程
  • cocos2dx开发的游戏
  • android 数据库app
  • 怎么用python画图具体步骤
  • a*算法的优缺点
  • jquery绑定事件和移除事件
  • unity 面向对象
  • 详解Python装饰器由浅入深
  • python程序开发
  • 用python绘制一条直线
  • 老司机指的是
  • 税务查询热线
  • 保险公司个人所得税扣除标准是多少
  • 知道纳税人识别号怎么转账
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设