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 ...
随机推荐
- (旧)子数涵数·C语言——条件语句
首先,我们讲一下理论知识,在编程中有三种结构,分别是顺序结构.条件结构.循环结构,如果用流程图来表示的话就是: 那么在C语言中,如何灵活运用这三种结构呢?这就需要用到控制语句了. 而条件语句便是控制语 ...
- ArrayList,Hashtable,List<T>,Dictionary<K,V>
1.ArrayList ArrayList list = new ArrayList(); //for遍历 ; i < list.Count; i++) { SE se=(SE)list[i]; ...
- Java集合 Json集合之间的转换
1. Java集合转换成Json集合 关键类:JSONArray jsonArray = JSONArray.fromObject(Object obj); 使用说明:将Java集合对象直接传进JSO ...
- ASP.NET控件绑定数据源
DataList/GridView/Repeater DataSet表示数据集,其中包含表,约束和表之间的关系.与现有数据源的交互通过DataAdapter来控制. 源代码示例: SqlDataAda ...
- SAP Basis常用事务代码
事务码 描述(中英文) SBIT Menu 菜单 SBTA Test background processing 后台处理测试 SBTU Background processi ...
- ArcObject10.1降级至10.0
最开始接触ArcGIS版本是9.3,为了需要也安装了9.2进行开发:因为自己的电脑配置较低,所以跑不起10.0中文版:毕业工作后,行业内用10.1居多(虽然10.3已出):现在10.4都要出来了:由于 ...
- DataTable 转换为ArrayList 再转换成 json 格式
//JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer(); //javaScriptSeriali ...
- Python基础(6)--条件、循环
本文的主要内容是 Python 的条件和循环语句以及与它们相关的部分. 我们会深入探讨if, while, for以及与他们相搭配的else,elif,break,continue和pass语句. 本 ...
- Java从零开始学四十三(DOM4j解析XML)
一.创建XML // 建立XML public static void gernatorXML() { // 创建Document对象 Document doc = DocumentHelper.cr ...
- iOS闹钟实现
UILocalNotification *notification=[[UILocalNotification alloc] init]; if (notification!=nil) ...