Hanoi塔
2016-03-19 17:01:35
问题描述:
假设有三个命名为 A B C 的塔座 ,在塔座A上插有n个直径大小不相同,由小到大编号为1 ,2 ,3 ,··· ,n的圆盘,要求将A座上的圆盘移至塔座C
并按同样的顺序叠排,圆盘移动必须遵守下列规则:
1:每次只能移动一个圆盘 2:圆盘可以插在任意一个塔座上 3:任何时刻都不能将一个较大的圆盘放在一个较小的圆盘上

f(n):原始A柱有n个圆盘,全部移动到C柱的移动次数
我们要将编号为n的圆盘移动到C柱上,首先须得将A柱上的n-1个圆盘从A->B(途中可能经过C柱),这需要f(n-1)次移动,将第n个圆盘移动到C柱需要一次移动,
再把B柱上的n-1个圆盘从B->C(途中可能经过A柱)仍然需要f(n-1)次移动
从而:f(n) =2*f(n-1)+1(n>=2),f(1) = 1递推可得
f(n) = 2^n -1
移动的方式:
思路:
当n=1,圆盘1直接从从A移动到C(此时的A、C是相对的)
否则,先将A上的前n-1个圆盘从A借助C移动到B,然后将第n个圆盘直接移动到柱C
对B柱上的n-1个圆盘进行相似的操作移动到C,这是很明显的递归
//(1)
#include <stdio.h>
void move(char x,char y,int i)
{
static int j = ;
printf("%d: %d from %c to %c\n",++j,i,x,y);
} void Hanoi(char x,char y,char z,int n)
{
if(n == )
{
move(x,z,n);
return;
}
else{
Hanoi(x,z,y,n-);
move(x,z,n);
Hanoi(y,x,z,n-);
}
} int main()
{
int n;
scanf("%d",&n);
Hanoi('A','B','C',n);
return ;
}

//(2)
#include <stdio.h>
void move(int n,char A,char B,char C)
{
if(n == )
{
printf("%d:%c-->%c\n",n,A,C);
return;
}
else{
move(n-,A,C,B);
printf("%d:%c-->%c\n",n,A,C);
move(n-,B,A,C);
}
}
int main()
{
int n;
scanf("%d",&n);
move(n,'A','B','C');
return ;
}
参照:http://www.cnblogs.com/liangyan19910818/archive/2011/08/26/2153926.html#3259652
Hanoi塔的更多相关文章
- 经典递归算法研究:hanoi塔的理解与实现
关于hanoi塔的原理以及概念,请Google,访问不了去百度. 主要设计到C中程序设计中递归的实现: 主代码实现如下: void hanoi(int src, int dest, int tmp, ...
- (转)Hanoi塔问题分析
转自:http://shmilyaw-hotmail-com.iteye.com/blog/2077098 简介 关于Hanoi塔问题的分析,在网上的文章都写烂了.之所以打算写这篇文章,更多的是针对这 ...
- 栈与递归的实现(Hanoi塔问题等等)
函数中有直接或间接地调用自身函数的语句,这样的函数称为递归函数.递归函数用 得好,可简化编程工作.但函数自己调用自己,有可能造成死循环.为了避免死循环,要 做到两点: (1) 降阶.递归函数虽然调用自 ...
- Hanoi塔问题——递归
/////////////Hanoi塔问题///////#include<iostream>using namespace std;void hanoi(int i,char A,char ...
- Hanoi塔问题
说明:河内之塔(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的,河内为越战时北越的首都,即现在的胡志明市:1883年法国数学家 Edouard Luc ...
- 【题解】Hanoi塔问题
题目描述 有三根柱A,B,C.在柱A上有N块盘片,所有盘片都是大的在下面,小片能放在大片上面.并依次编好序号,现要将A上的N块片移到C柱上,每次只能移动一片,而且在同一根柱子上必须保持上面的盘片比下面 ...
- 汉诺塔(Hanoi)——小小算法
传送门: 袁咩咩的小小博客 汉诺(Hanoi)塔源于古印度,是非常著名的智力趣题,大意如下: 勃拉玛是古印度的一个开天辟地的神,其在一个庙宇中留下了三根金刚石的棒,第一 根上面套着64个大小不一的圆形 ...
- 用函数递归的方法解决古印度汉诺塔hanoi问题
问题源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规 ...
- 算法笔记_013:汉诺塔问题(Java递归法和非递归法)
目录 1 问题描述 2 解决方案 2.1 递归法 2.2 非递归法 1 问题描述 Simulate the movement of the Towers of Hanoi Puzzle; Bonus ...
随机推荐
- 利用javascript、php和ajax实现计算器
计算器和ajax部分: <?php /** * Created by PhpStorm. * User: Administrator * Date: 16-9-2 * Time: 上午9:20 ...
- 【GOF23设计模式】适配器模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_适配器模式.对象适配器.类适配器.开发中场景 适配器模式 笔记本电脑只有USB接口,新买的键盘是PS2接口的,需要用适 ...
- js 数组常用方法
var arr =[0,1,2,3,4,5,6,7,8,9]; 1,shift() 删除数组的第一个元素,返回删除的值 //这里返回0 2,unshift(1,2) 把参数添加到数组的前面,返回值 ...
- Vue.js简介
Vue.js简介 Vue.js的作者为Evan You(尤雨溪),任职于Google Creative Lab,虽然是Vue是一个个人项目,但在发展前景上个人认为绝不输于Google的AngularJ ...
- Dynamics AX for Retail POS Development blogs
Dynamics AX for Retail POS Development Dynamics AX for Retail POS Development - Code Samples AX for ...
- Android 在外部存储读写文件
本文主要介绍android中如何在外部存储读写数据 sd卡的路径 sdcard:2.3之前的sd卡路径 mnt/sdcard:4.3之前的sd卡路径 storage/sdcard:4.3之后的sd卡路 ...
- 【读书笔记】iOS-验证应用内支付的凭证注意事项
1,简单来说,越狱后的手机由于没有沙盒作为保护,黑客可以对系统进行任意的修改,所以,在支付过程中,苹果返回的已付款成功的凭证可能是伪造的.客户端拿到付款凭证之后,还需要将凭证上传到自己的服务器,进行二 ...
- iOS内存管理(二)之深拷贝和浅拷贝
对象拷贝(复制对象) 1.复制对象顾名思义,复制一个对象作为副本,它会开辟一块新的一块内存(堆内存)来存储副本对象,就像复制文件一样.即源对象和副本对象是两块不同的内存区域. 2.NSObject ...
- Xcode找Library位置
- 解决tableViewCell分割线不到左边界的问题
在tableView控制器的.m文件中任何位置加入以下两个方法即可解决 /** * 下面两个方法解决cell分割线不到左边界的问题 */ -(void)viewDidLayoutSubviews { ...