汉诺塔问题深刻而简单的理解
来源:互联网 发布:dede目录权限优化工具 编辑:程序博客网 时间:2024/05/20 20:44
汉诺塔问题深刻而简单的理解
汉诺塔问题(Hanio塔)的问题,本人看了很多版本,大多比较死板,理解很困难,经过自己的理解,写写感想!!
其实很简单,就是要把a塔上的移动到c塔上,见图,就是把图1移动成图2:
先假设塔座是排成一个三角形,a-->b-->c-->a,形成一个顺时针的圆盘,在移动圆盘的时候,如果是奇数次移动(第1次,第3次,第5次·······),那么就把最小的圆盘移动到顺时针方向的下一个塔座上;如果是偶数次移动(第2次,第4次,第6次······),则保持最小的圆盘不动,而在其他的两个塔座之间,将较小的圆盘移动到另一座塔座上去。(总体思想差不多就是这样,还是不懂往下看)
上面的算法应该是很简洁明了的,可以证明它是正确的,但是光看算法肯定很难理解,下面用递归的技术来解决一下这个问题,当n=1的时候,很简单,只要将a塔座上唯一的一个圆盘移动到c塔座上即可解决问题;当n>1的时候呢,需要把b塔座作为中转塔座(辅助用),此时只要将n-1个较小的圆盘按照规则从a先移动到b上,然后将剩下的最大的圆盘从塔座a直接移动到c上,最后,将n-1个剩下的圆盘按照相同的方法移动到c上,不同的只是原来是n个,现在是n-1个。由此可见,n个圆盘的移动问题就可以分解为两次n-1个圆盘的移动问题(第一次是指n-1个圆盘从a移动到b,第二次是指n-1个圆盘从b移动到c),这移动又可以递归用上述方法来做。由此可以设计出解决汉诺塔问题的递归算法:
void Hanoi(int n,char a,char b,char c){ if(n>0) { Hanoi(n-1,a,c,b); cout<<"把"<<n<<"号从"<<a<<"移动到"<<c<<endl; Hanoi(n-1,b,a,c); }}
代码很简单,其中,hanoi(n,a,b,c)表示将塔座a上自下而上,由大到小叠放在一起的n个圆盘依移动规则移至塔座b上并且按照同样的顺序叠放,在移动的过程中,以塔座b作为中转塔座,好了,多看几遍你就会了,鄙人也是理解能力不怎么强的,但是看了几遍也就会了,也就是那么回事吧,如果有什么问题的,欢迎留言!
最后再附上整体的代码,给初学者看的,大牛直接无视^_^
C++:
#include <iostream>using namespace std;void Hanoi(int n,char a,char b,char c){ if(n>0) { Hanoi(n-1,a,c,b); cout<<"把"<<n<<"号从"<<a<<"移动到"<<c<<endl; Hanoi(n-1,b,a,c); }}int main(){ int n; cin>>n; Hanoi(n,'a','b','c'); return 0;}
C语言版
#include <stdio.h>void Hanoi(int n,char a,char b,char c){ if(n>0) { Hanoi(n-1,a,c,b); printf("把%d号从%c移动到%c\n",n,a,c); Hanoi(n-1,b,a,c); }}int main(){ int n; scanf("%d",&n); Hanoi(n,'a','b','c'); return 0;}
以上代码在code::blocks上运行通过
- 汉诺塔问题深刻而简单的理解
- 区间DP,子问题的深刻理解
- 深刻的理解递归汉诺塔(Hanoi)
- 句柄的深刻理解
- Layout_weight的深刻理解
- 几种关于卷积的深刻而有趣的理解【看过绝对不会再忘了】
- 对String的深刻理解
- 对String的深刻理解
- 对SAP的深刻理解
- 对sed 的深刻理解。
- Android:Layout_weight的深刻理解
- Android:Layout_weight的深刻理解
- Android:Layout_weight的深刻理解
- Android:Layout_weight的深刻理解
- Android:layout_weight的深刻理解
- Android:Layout_weight的深刻理解
- Android:Layout_weight的深刻理解
- Android:Layout_weight的深刻理解
- Through the Interface——AutoDesk API使用入门
- android完全退出应用
- 使用别人的LocalDB制作本地库
- 【ASM的学习】asm官方手册学习心得01
- cuda 任意维度的矩阵相乘
- 汉诺塔问题深刻而简单的理解
- poj 2486 树形DP
- android Service(一) activity启动Service方式一:startService()
- LinearLayout中weight的学习
- 处理消息
- 某个工具从以下位置返回了错误代码: "正在执行预链接事件
- java和c的区别
- 易友姓名测试软件发布
- Micaps3.2二次开发实例教程-3