1 / 13
文档名称:

汉诺塔非递归算法.ppt

格式:ppt   大小:1,625KB   页数:13页
下载后只包含 1 个 PPT 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

汉诺塔非递归算法.ppt

上传人:xunlai783 2018/1/5 文件大小:1.59 MB

下载得到文件列表

汉诺塔非递归算法.ppt

文档介绍

文档介绍:汉诺塔非 递归算法
汉诺塔
1
什么是汉诺塔问题
汉诺塔问题(又称河内塔问题)是根据一个传说形成的一个问题:
有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:
1. 每次只能移动一个圆盘;
2. 大盘不能叠在小盘上面。
问:如何移?最少要移动多少次?
汉诺塔
2
算法分析
1. n个圆盘的汉诺塔实现过程正好是2的n次幂减一步。
2. 由于第一步肯定是第一类移动,所以循环执行第奇数次时,都是第一类移动。若将三个杆分别编为a、b、c,则第一类移动是从a杆移动到c杆,则当n为奇数时,第一类移动的次序为a到c到b再回到a的循环。当n为偶数时,第一类移动的次序为a到b到c再回到a的循环。
3. 循环执行第偶数次时,都是非第一类移动。比较三个杆的顶端的圆环,将两个顶端较大的圆环中较小的小圆环移动到顶端圆环最大的杆上即可。
汉诺塔
3
算法分析
实现思路:
1、最外层是一个2的n次幂减一的循环。
2、第一类移动的实现:一、可以根据以上的结论及n和循环的次数判断从哪杆移动到哪个杆。二、可以记录第一类环的位置结合以上结论确定移动到哪个杆上。三、可以记录第一类环的位置和它前一次所在的位置,剩下的那个杆就是此次移动的目的杆。开始循环前,前一次的初始位置设置为b(n为奇数时)或c(n为偶数时)。
3、非第一类移动的实现:一、可以取出三个杆上最上层的圆环,比较出大小,将第二大的圆环移动到最大圆环所在的杆即可。二、如果记录了第一类环的位置的话,只需取出剩余两个杆最上层的圆环,比较一次,将较小的圆环移动到较大的环所在的杆上即可。
汉诺塔
4
实现代码
#include <iostream>
using namespace std;
//圆盘的个数最多为64
const int MAX = 64;
//用来表示每根柱子的信息
struct st
{
int s[MAX]; //柱子上的圆盘存储情况
int top; //栈顶,用来最上面的圆盘
char name; //柱子的名字,可以是A,B,C中的一个
int Top()//取栈顶元素
{
return s[top];
}
int Pop()//出栈
{
汉诺塔
5
{
return s[top--];
}
void Push(int x)//入栈
{
s[++top] = x;
}
} ;
long Pow(int x, int y); //计算x^y
void Creat(st ta[], int n); //给结构数组设置初值
void Hannuota(st ta[], long max); //移动汉诺塔的主要函数
int main(void)
{
int n;
汉诺塔
6
cin >> n; //输入圆盘的个数
st ta[3]; //三根柱子的信息用结构数组存储
Creat(ta, n); //给结构数组设置初值
long max = Pow(2, n) - 1;//动的次数应等于2^n - 1
Hannuota(ta, max);//移动汉诺塔的主要函数
system("pause");
return 0;
}
void Creat(st ta[], int n)
{
ta[0].name = 'A';
ta[0].top = n-1;
//把所有的圆盘按从大到小的顺序放在柱子A上
汉诺塔
7
for (int i=0; i<n; i++)
ta[0].s[i] = n - i;
//柱子B,C上开始没有没有圆盘
ta[1].top = ta[2].top = 0;
for (int i=0; i<n; i++)
ta[1].s[i] = ta[2].s[i] = 0;
//若n为偶数,按顺时针方向依次摆放 A B C
if (n%2 == 0)
{
ta[1].name = 'B';
ta[2].name = 'C';
}
else //若n为奇数,按顺时针方向依次摆放 A C B
{
ta[1].name = 'C';
ta[2].name = 'B';
}
}
汉诺塔
8
long Pow(int x, int y)
{
long sum = 1;
for (int i=0; i<y; i++)
sum *= x;
return sum;
}
void Hannuota(st ta[], long max)
{
int k = 0; //累计移动的次数
int i = 0;
int ch;
while (k <

最近更新

国际贸易中供应链金融服务模式及风险控制研究.. 2页

2024年小学音乐教研总结范文(精选5篇) 13页

国电益阳发电公司燃料成本管理研究的开题报告.. 2页

2024年小学音乐教师工作计划(精选5篇) 14页

国家级非物质文化遗产河阳山歌的旅游开发研究.. 2页

国家助学贷款管理问题与对策研究的开题报告 2页

2024年小学音乐《童心是小鸟》教学反思 8页

国产碳纤维增强环氧基复合材料的制备与性能研.. 2页

固相萃取—超高效液相色谱检测食品中直接红染.. 2页

2024年小学运动会口号 3页

围海堵口工程水力条件研究的开题报告 2页

团成员星系类型与颜色——颜色梯度的开题报告.. 2页

2024年小学课外活动计划 43页

回旋行波管多模稳态理论及稳定性研究的开题报.. 2页

四足机器人环境适应行走的算法及实验研究的开.. 2页

四种猪病原菌PCR诊断方法的建立与应用的开题报.. 2页

2024年小学语文评课:《桂林山水》 6页

四氧化三钴的形貌可控合成及催化性能研究的开.. 2页

四川省可持续发展协调性分析——基于可持续发.. 2页

四川汪家洞块石粘性土滑坡稳定性分析的开题报.. 2页

2023年消防救援站党支部工作总结 4页

教师心得体会师德感悟篇范文2023年 9页

学校食堂6s管理内容和标准四篇 51页

消防工程施工进度计划表格 4页

夹江陶瓷产业发展历程和基本概况 5页

超声科质量控制评分表(共1页) 1页

高速铁路桥梁缺陷整治方案 56页

尊师开示 7页

张宏宝尊师谈养生修炼的利与弊 10页

广义财政论 6页