递归解决汉诺塔问题
2016-07-20 10:43
435 查看
题目:在经典问题汉诺塔中,有三根柱子及N个不同大小的穿孔圆盘,盘子可以任意滑入一根柱子。一开始,所有盘子自底向上从大到小一次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时有以下限制:
(1)每次只能移动一个盘子;
(2)盘子只能从柱子顶端滑出移动到下一根柱子;
(3)盘子只能叠在比它大的盘子上。
请运用栈,编写程序将所有盘子从第一根柱子移到最后一根柱子。
思路:假设有1,2,3,4,5从上到下叠放在第一根柱子上,为了把它们搬移到第三根柱子上,需要先把5挪到第三根柱子上,而在这之前,说明第一根柱子上只剩下一个5了,这时的1,2,3,4应该放在第二根柱子上了。5挪到第三根柱子上以后,再把第2根柱子上的1,2,3,4再挪到第三个柱子上。所以整个搬移过程分三步:(1)把1,2,3,4从第一根柱子挪到第二根柱子上;(2)把5从第一根柱子挪到第三根柱子上;(3)把1,2,3,4从第二根柱子挪到第三根柱子上。可以看到(1)(3)步等同于原问题,只不过盘子的个数减少了一个,因此可以递归的解决这个问题。
(1)每次只能移动一个盘子;
(2)盘子只能从柱子顶端滑出移动到下一根柱子;
(3)盘子只能叠在比它大的盘子上。
请运用栈,编写程序将所有盘子从第一根柱子移到最后一根柱子。
思路:假设有1,2,3,4,5从上到下叠放在第一根柱子上,为了把它们搬移到第三根柱子上,需要先把5挪到第三根柱子上,而在这之前,说明第一根柱子上只剩下一个5了,这时的1,2,3,4应该放在第二根柱子上了。5挪到第三根柱子上以后,再把第2根柱子上的1,2,3,4再挪到第三个柱子上。所以整个搬移过程分三步:(1)把1,2,3,4从第一根柱子挪到第二根柱子上;(2)把5从第一根柱子挪到第三根柱子上;(3)把1,2,3,4从第二根柱子挪到第三根柱子上。可以看到(1)(3)步等同于原问题,只不过盘子的个数减少了一个,因此可以递归的解决这个问题。
void MoveTop(stack<int>& origin, stack<int>& destination) { if(origin.empty()) return; int top = origin.top(); origin.pop(); destination.push(top); } void Remove(stack<int>& origin, stack<int>& buffer, stack<int>& destination, int n) { if(n == 1) { MoveTop(origin,destination); return; } else { Remove(origin,destination,buffer,n-1); MoveTop(origin, destination); Remove(buffer,origin,destination, n-1); } }
相关文章推荐
- Android开发之圆角边框
- ReactNative Demo - Dimensions 的使用
- Eclipse 引用CardView这样的5.0控件
- org.apache.ibatis.binding.BindingException【原因汇总】
- 数据结构
- UTF—8与UTF—8(无bom)格式相比有什么不同
- URL传递中文字符,特殊危险字符的解决方案(仅供参考)urldecode、base64_encode
- Fire!(两次bfs)
- 熟悉业务逻辑
- Class.forName的理解
- 自定义控件
- React 开源组件笔记
- Android.mk文件语法规范及使用模板【转载】
- JS鼠标事件大全
- 2016多校第一场 1006 hdu 5728 PowMod
- django + mssql + sqlserver2008
- Spring基于注解实现Bean定义支持如下三种注解
- thinkphp模板中数组的使用
- 业务运维实战:腾讯是怎么优化APP用户体验的?
- Netty精粹之TCP粘包拆包问题