汉诺塔问题(The Tower of Hanoi)的递归算法与非递归算法
非递归算法:
根据圆盘的数量确定柱子的排放顺序:
若n为偶数,按顺时针方向依次摆放 A B C;
若n为奇数,按顺时针方向依次摆放 A C B。
然后进行如下操作:
(1)按顺时针方向把圆盘1从现在的柱子移动到下一根柱子,即当n为偶数时,若圆盘1在柱子A,则把它移动到B;若圆盘1在柱子B,则把它移动到C;若圆盘1在柱子C,则把它移动到A。
(2)接着,把另外两根柱子上可以移动的圆盘移动到新的柱子上。即把非空柱子上的圆盘移动到空柱子上,当两根柱子都非空时,移动较小的圆盘。
(3)反复进行(1)(2)操作,最后就能按规定完成汉诺塔的移动。
C++实现:
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long LL;
struct Hanoi
{
int n;
struct Tower
{
char Name;
stack<int> Disks;
}Tow[];
void init(int num)
{
n=num;
for(int i=;i<;i++)
{
Tow[i].Name='A'+i;
while(!Tow[i].Disks.empty()) Tow[i].Disks.pop();
}
for(int i=n;i>=;i--) Tow[].Disks.push(i);
}
void solve()
{
LL cnt=,cnt_max=(<<n)-;
while(cnt<cnt_max)
{
cnt++; int flag1,flag2;
if(cnt%)//第奇数次的移动
{
for(int i=;i<;i++) if(!Tow[i].Disks.empty() && Tow[i].Disks.top()==) flag1=i;
if(n%)//n为奇数
flag2=((flag1-)+)%;
else
flag2=(flag1+)%;
}
else//第偶数次的移动
{
flag1=flag2=-;
for(int i=;i<;i++)
{
if(!Tow[i].Disks.empty() && Tow[i].Disks.top()==) continue; if(flag1==-) flag1=i;
else if(flag2==-) flag2=i;
} if(!Tow[flag1].Disks.empty() && !Tow[flag2].Disks.empty())
{
if(Tow[flag1].Disks.top()>Tow[flag2].Disks.top()) swap(flag1,flag2);
}
else
{
if(Tow[flag1].Disks.empty()) swap(flag1,flag2);
}
} cout<<cnt<<": "<<"Move disk "<<Tow[flag1].Disks.top()<<" from "<<Tow[flag1].Name<<" to "<<Tow[flag2].Name<<endl;
Tow[flag2].Disks.push(Tow[flag1].Disks.top());
Tow[flag1].Disks.pop();
}
}
}hanoi;
int main()
{
int n;
cout<<"输入圆盘个数:"; cin>>n;
hanoi.init(n);
hanoi.solve();
}
递归算法:
设Hanoi(n,a,c,b)表示n个圆盘在a柱上,通过服从汉诺塔规则的若干步骤移动,在b柱的辅助下,全部按原顺序移动到了c柱上;
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long LL;
LL cnt;
void Hanoi(int n,char a,char c,char b)
{
if(n==)
{
cout<<++cnt<<": "<<"Move disk "<<n<<" from "<<a<<" to "<<c<<endl;
return;
} Hanoi(n-,a,b,c);
cout<<++cnt<<": "<<"Move disk "<<n<<" from "<<a<<" to "<<c<<endl;
Hanoi(n-,b,c,a);
return;
}
int main()
{
int n;
cout<<"输入圆盘个数:";
cin>>n;
cnt=;
Hanoi(n,'A','C','B');
}
汉诺塔问题(The Tower of Hanoi)的递归算法与非递归算法的更多相关文章
- 算法:汉诺塔问题(Tower of Brahma puzzle)
一.算法背景 最早发明这个问题的人是法国数学家爱德华·卢卡斯.传说越南河内某间寺院有三根银棒(A, B, C),上串 64 个金盘. 寺院里的僧侣依照一个古老的预言,以上述规则移动这些盘子:预言说当这 ...
- JavaScript算法实现之汉诺塔(Hanoi)
目前前端新手,看到的不喜勿喷,还望大神指教. 随着Node.js,Angular.js,JQuery的流行,点燃了我学习JavaScript的热情!以后打算每天早上跟晚上抽2小时左右时间将经典的算法都 ...
- C++例题2:汉诺塔问题
#include<iostream>#include<stdlib.h>using namespace std;void Hanoi(int n,char A,char B,c ...
- 汉诺塔 Hanoi Tower
电影<猩球崛起>刚开始的时候,年轻的Caesar在玩一种很有意思的游戏,就是汉诺塔...... 汉诺塔源自一个古老的印度传说:在世界的中心贝拿勒斯的圣庙里,一块黄铜板上插着三支宝石针.印度 ...
- 用递归方法解决汉诺塔问题(Recursion Hanoi Tower Python)
汉诺塔问题源于印度的一个古老传说:梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.梵天命令婆罗门把圆盘按大小顺序重新摆放在另一根柱子上,并且规定小圆盘上不能放 ...
- 汉诺塔问题(Hanoi Tower)递归算法解析(Python实现)
汉诺塔问题 1.问题来源:汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从上往下从小到大顺序摞着64片黄金圆盘.上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根 ...
- [CareerCup] 3.4 Towers of Hanoi 汉诺塔
3.4 In the classic problem of the Towers of Hanoi, you have 3 towers and N disks of different sizes ...
- 《hanoi(汉诺塔)问题》求解
//Hanoi(汉诺)塔问题.这是一个古典的数学问题,用递归方法求解.问题如下: /* 古代有一个梵塔,塔内有3个座A,B,C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上. 有一个老和 ...
- 汉诺塔-Hanoi
1. 问题来源: 汉诺塔(河内塔)问题是印度的一个古老的传说. 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵 ...
随机推荐
- Tomcat------如何更改被IIS占用的80端口
1.打开cmd,运行'netstat -ano'发现80端口被pid=4的进程占用 2.打开任务管理器,发现pid=4的进程,其实是system进程,其对应的进程描述是NT kernel & ...
- UpLoader------实现上传大文件
代码: <div id="selectFile">选择文件1</div> <script> var da = newGuid(); var kk ...
- 开启apache的server-status辅助分析工具
在Apache的调优过程中,可以通过查看Apache提供的server-status(状态报告)来验证当前所设置数值是否合理,在httpd.conf文件中做如下设置来打开: #加载mod_status ...
- ios开发之--tableview单选/多选实现(非tableview的editing状态)及默认选中
实现思路比较简单,这里仅做记录: 直接上代码: 1,实现didSelectRowAtIndexPath方法 -(void)tableView:(UITableView *)tableView didS ...
- ArcGIS应用
1.ArcGIS Server发布资源报错:网络资源问题 有可能是跟网络相关的服务没有开启,开启相关服务器后有可能可以解决此问题. 还有可能通过此法解决:开始--控制面板--网络和共享中心--高级共享 ...
- Spring容器AOP的理解
一句话理解:根据被代理对象信息通过Proxy动态生成我们具体的代理类. 实现就动态代理.那动态代理是什么呢? 动态代理其实并不是什么新鲜的东西,学过设计模式的人都应该知道代理模式,代理模式就是一种静态 ...
- Elasticsearch未授权访问漏洞
Elasticsearch服务普遍存在一个未授权访问的问题,攻击者通常可以请求一个开放9200或9300的服务器进行恶意攻击. 0x00 Elasticsearch 安装 前提,保证安装了JDK 1. ...
- Nginx 解析PHP
配置如下: [root@localhost ~]$ cat /usr/local/nginx/conf/vhost/test.com.conf server { listen 80; server_n ...
- hadoop核心逻辑shuffle代码分析-map端
首先要推荐一下:http://www.alidata.org/archives/1470 阿里的大牛在上面的文章中比较详细的介绍了shuffle过程中mapper和reduce的每个过程,强烈推荐先读 ...
- python文件操作笔记
一.python中对文件.文件夹操作时经常用到的os模块和shutil模块常用方法. 1.得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 2.切换工作目录: os.c ...