汉诺塔的实现 c++
汉诺塔问题:假设有从左到右有三个名字分别为x,y,z的塔座, 在塔座x上有n各直径大小各不相同,按照直径从小到大编号为1,2,。。。n的圆盘。现在要求将x轴上的n个圆盘移动到塔座z上,并且按同样的顺序叠排,圆盘移动规则如下
- 每次只能移动一个圆盘
- 圆盘可以插在任何一个塔座上
- 任何时刻小盘都必须在大盘之上
思路如下:n=1的时候,问题最简单,直接把圆盘移动到z就行。当n>1的时候,就需要用y作为辅助塔座,设法将压在n上面的n-1
的圆盘从x移动到y上,则可以把圆盘n移到z上面,再通过上面的办法把y上的圆盘移动到z上面。如何将n-1个圆盘从一个塔座移动到另外一个塔座是一个和原问题一样的问题,只是规模不相同。
这里用vector来保存每一个塔座上的圆盘,当移动圆盘时,一个塔座的vector弹出最后面的元素, 一个塔座将前面弹出的圆盘添加到子集的vector中
1 /* 2 author: LaiXingYu 3 date:2018/5/10 4 */ 5 /* 6 para: @n, number of plates, @x, @y, @z, move plates from x to z, via y; 7 */ 8 void hanoi(int n, vector<int>& x, vector<int>& y, vector<int>& z){ 9 if(n == 1){ 10 z.push_back(x.back()); 11 x.pop_back(); 12 return; 13 }else{ 14 hanoi(n-1, x, z, y); //把n-1个盘子从x经过z移动到y 15 z.push_back(x.back()); //把x剩下的盘子移动到z上 16 x.pop_back(); 17 hanoi(n-1, y, x, z); //把n-1个盘子从y经过x移动到z 18 } 19 }
有疑惑或者更好的解决方法的朋友,可以联系我,大家一起探讨。qq:1546431565
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)