递归方法求解汉诺塔!
来源:互联网 发布:mac系统官方下载地址 编辑:程序博客网 时间:2024/05/21 19:33
Sample Input
520
Sample Output
A-->C A-->B C-->B A-->C B-->A B-->C A-->C A-->B C-->B C-->A B-->A C-->B A-->C A-->B C-->B A-->C B-->A B-->C A-->C B-->A C-->B C-->A B-->A B-->C A-->C A-->B C-->B A-->C B-->A B-->C A-->C A-->B A-->C B-->C
此当N=3时,移动次序如下:
(1) 从木桩A将圆盘1移动到木桩C。
(2) 从木桩A将圆盘2移动到木桩B。
(3) 从木桩C将圆盘1移动到木桩B。
(4) 从木桩A将圆盘3移动到木桩C。
(5) 从木桩B将圆盘1移动到木桩A。
(6) 从木桩B将圆盘2移动到木桩C。
(7) 从木桩A将圆盘1移动到木桩C。
首先我们观察当圆盘只有一个(即N=1)的时候,就直接把圆盘由木桩A移动到木桩C即可,不必用到木桩B。当圆盘不只一个(即N>1)的时候, 为我们必须遵守上述的移动规则,也就是直径较小的圆盘永远置于直径较大的圆盘上,所以一开始的目的就必须想办法先把木桩A最下面的圆盘,也就是最大的圆盘取出来,移到木桩C的最下面去放,这 木桩C才能再放第二大的圆盘上去,如此一层层垒上去,直到完成目 。 据这 的概念,对于N>1的解,可以分解成下列三个子问题:
(1) 将木桩A项端的N-1个圆盘通过木桩C移动到木桩B。
(2) 将木桩A唯一的圆盘移到木桩C:A→C
(3) 将木桩B顶端的N-1个圆盘通过木桩A移动到木桩C。
观察上面的三个子问题,我们发现第一个子问题及第三个子问题已经构成了递归调用,且问题也较为简化,即从N个圆盘变成N-1个圆盘的问题。而递归的终止条件,也就是在N=1时,就是发生在第二个子问题上,就不必再递归下去了,直接输出移动方法即可, 此我们可以把解题方案看成是一个分治算法, 为N个圆盘的解可以被分解成N-1个圆盘的解与N=1个圆盘的解。
算法如下:
#include<stdio.h>#include<math.h>int i=0,m;void move(char x,char y){ printf("%c-->%c ",x,y); i++; if(i%5==0) printf("\n");}void hanoi(int n,char one,char two ,char three){ if(n==1)move(one,three); else { hanoi(n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three); }}main(){ do { i = 0; scanf("%d",&m); if(m==0) break; hanoi( m,'A','B','C'); printf("\n"); }while(m!=0);}
0 0
- 递归方法求解汉诺塔!
- 用递归方法求解汉诺塔问题
- 用递归方法求解汉诺塔问题。
- 汉诺塔问题的递归求解方法
- 递归方法求解n!
- 用递归方法求解
- 采用递归和非递归方法求解汉诺塔问题
- 八皇后求解方法(递归求解)
- 递归方法 求解fibnacci数列
- 主方法求解递归式
- 递归式求解-主方法
- 递归求解汉诺塔问题
- 汉诺塔递归求解
- 汉诺塔问题递归求解
- 第十二周项目三 用递归方法求解(汉诺塔)
- 第十二周项目 3 用递归方法求解(汉诺塔)
- 第十二周项目3-用递归方法求解6 汉诺塔
- 非递归求解汉诺塔的两种方法
- 用递归方法求解猴子吃桃问题
- 求解三个数的最大的数,求最小的同…
- 转~素数求法
- 求水仙花数
- 转的算法~~图的广度搜索!按照字典…
- 递归方法求解汉诺塔!
- 单链表的删除操作的实现
- 单链表的插入操作的实现---后插法…
- 单链表的查找操作
- goto语句是一种无条件转移语句
- 单链表的删除
- 单链表的定位操作
- 递归的原理的验证程序!!
- 网络编程一<线程间通信的方法之UNIX域套接字>