算法与设计实验1:N阶Hanoi塔问题
2017-12-11 11:32
344 查看
由于实验指导书上没有给出具体的问题描述,这里把ACM的算法描述列了出来:
问题: 假设有三个分别命名为X、Y和Z的塔座,在塔座X上插有n个直径大小各不相同、依小到大编号为1,2,...,n的圆盘。现要求将X轴上的n个圆盘移至塔座Z上并仍按同样顺序叠排,圆盘移动时必须遵循下列规则:
1)每次只能移动一个圆盘;
2)圆盘可以插在X、Y和Z中的任一塔座上;
3)任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。
如何实现移动圆盘的操作呢?当n=1时,问题比较简单,只要将编号为1的圆盘从塔座X直接移至塔座Z上即可;当n>1时,需利用塔座Y作辅助塔座,若能设法将压在编号为n的圆盘之上的n-1个圆盘从塔座X(依照上述法则)移至塔座Y上,则可先将编号为n的圆盘从塔座X移至塔座Z上,然后再将塔座Y上的n-1个圆盘(依照上述法则)移至塔座Z上。而如何将n-1个圆盘从一个塔座移至另一个塔座的问题是一个和原问题具有相同特征属性的问题,只是问题的规模小1,因此可以用同样的方法求解。由此可得如下图算法所示的求解n阶Hanoi塔问题的C函数。
算法实现:
运行结果:
3阶是7步,
问题: 假设有三个分别命名为X、Y和Z的塔座,在塔座X上插有n个直径大小各不相同、依小到大编号为1,2,...,n的圆盘。现要求将X轴上的n个圆盘移至塔座Z上并仍按同样顺序叠排,圆盘移动时必须遵循下列规则:
1)每次只能移动一个圆盘;
2)圆盘可以插在X、Y和Z中的任一塔座上;
3)任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。
如何实现移动圆盘的操作呢?当n=1时,问题比较简单,只要将编号为1的圆盘从塔座X直接移至塔座Z上即可;当n>1时,需利用塔座Y作辅助塔座,若能设法将压在编号为n的圆盘之上的n-1个圆盘从塔座X(依照上述法则)移至塔座Y上,则可先将编号为n的圆盘从塔座X移至塔座Z上,然后再将塔座Y上的n-1个圆盘(依照上述法则)移至塔座Z上。而如何将n-1个圆盘从一个塔座移至另一个塔座的问题是一个和原问题具有相同特征属性的问题,只是问题的规模小1,因此可以用同样的方法求解。由此可得如下图算法所示的求解n阶Hanoi塔问题的C函数。
算法实现:
#include <stdio.h> int c=0; void move(char x,int n,char z){ printf("%d. Move disk %d from %c to %c \n",++c,n,x,z); } void hanoi(int n,char x,char y,char z){ if(n==1) move(x,1,z);//将编号1的圆盘从x移到z else{ hanoi(n-1,x,z,y);//将x上编号1--n-1的圆盘移到y,z做辅助 move(x,n,z);//将编号为n的圆盘从x移到z hanoi(n-1,y,x,z);//将y上编号为1--n-1的圆盘移到z,x做辅助 } } int main(){ int n; printf("请输入你汉诺塔的阶数:") ; scanf("%d",&n); hanoi(n,'x','y','z'); return 0; }
运行结果:
3阶是7步,
然后以此类推 f(4)=f(3)+1+f(3)=15 f(5)=f(4)+1+f(4)=31 f(6)=f(5)+1+f(5)=63 f(7)=f(6)+1+f(6)=127 f(8)=f(7)+1+f(7)=255 f(9)=f(8)+1+f(8)=511
这样就完成了这个算法。
相关文章推荐
- n阶Hanoi塔问题 - 算法设计与分析实验1
- 算法分析与设计实验三 回溯法 24点问题 n皇后问题
- 用递归法:设计算法求解汉诺塔问题,并编程实现。 (1) Hanoi(汉诺)塔问题分析 这是一个古典的数学问题,是一个用递归方法解题的典型例子。问题是这样的:古代有一个梵塔,塔内有3个座 A,B,C
- 算法分析与设计实验二(关于动态规划问题)
- 算法分析与设计实验二(关于动态规划问题)
- Kruskal算法求最小生成树-算法设计与分析实验3
- 实验四(外设驱动程序设计)问题总结
- Zedboardwebcam设计问题篇(六)opencv处理帧数据之算法改进
- 蛮力法:设计算法求解背包问题,并编程实现。
- 稳定匹配问题——稳定婚姻算法设计
- 毒酒问题----算法设计与编程题------有1000桶酒,其中有一桶酒有毒.......
- 南邮算法分析与设计实验2 动态规划法
- 中国象棋程序的设计与实现(六)--N皇后问题的算法设计与实现(源码+注释+截图)
- 基因表达式编程的任务指派问题求解算法设计与实现
- 信息安全系统设计基础-五次实验问题总结
- 工作流引擎设计中的遍历算法的问题
- [算法设计与分析]4.2.1枚举法(百钱百鸡问题2种解法+数字谜2种解法)
- 【并查集】数据结构与算法实验题 11.2 病毒排查问题
- 最大间隙问题。给定 n 个实数,求这n个实数在数轴上相邻2个数之间的最大差值,设计解最大间隙问题的线性时间算法。
- 算法训练 Hanoi问题