用递归实现 hanoi塔

// hanoi.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

void move(int n,char moveStart,char moveEnd){
	printf("move %d from %c to %c\n",n,moveStart,moveEnd);
}

void hanoi(int n,char moveStart,char moveTemp,char moveEnd){
	if (n == 1)
	{
		move(n,moveStart,moveEnd);
	}
	else
	{
		hanoi(n-1,moveStart,moveEnd,moveTemp);
		move(n,moveStart,moveEnd);
		hanoi(n-1,moveTemp,moveStart,moveEnd);
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	int n;
	printf("请输入hanoi塔的 层数:");
	scanf("%d",&n);
	hanoi(n,'x','y','z');
	return 0;
}

时间: 2024-11-10 14:11:07

用递归实现 hanoi塔的相关文章

栈和递归之Hanoi塔

hanoi塔 代码 <pre name="code" class="cpp">#include<stdio.h> void move(char x,int n,char y) { static int k=1; printf("Step %d : %d from %c >>->> to %c \n",k++,n,x,y); } void hanoi(int n,char A,char B,char

递归5--汉诺塔问题的栈实现

递归5--汉诺塔问题的栈实现 汉诺塔的递归解法:http://www.cnblogs.com/Renyi-Fan/p/6949515.html 一.心得 系统里面的递归就是靠栈来维护的,区别我们普通栈的是维护递归的那个栈有返回地址递归每深入一层,栈顶元素加一递归每退出一层,栈顶元素减一返回地址是执行完这一层,返回到上一层的地址 就是从栈里面取元素然后操作这个元素,如此循环往复,和队列操作几乎完全一样然而这里用队列不得行,因为最前面的问题分解的子问题没有放在队列最前面 二.分析 三.代码及结果 1

【数据结构与算法】递归汉诺塔

汉诺塔 汉诺塔是根据一个传说形成的数学问题(关于汉诺塔): 有三根杆子A,B,C.A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小.要求按下列规则将所有圆盘移至C杆: 每次只能移动一个圆盘: 大盘不能叠在小盘上面. 提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则. 递归汉诺塔 解题思路: 可以把问题简化成2个盘子的情况,如:A上有两个盘子,B和C是空的.如果要把A的两个盘子全部移动到C,需要经过以下步骤: 1.A移动一个盘子到B 2.A移动一个盘

n阶Hanoi塔问题

假设有三个命名为x.y.z的塔座,在塔座x上插有n个直径大小各不相同.依小到大编号为1.2...n的圆盘,要求将x塔座上的n个圆盘移至z上,并仍按同样的顺序叠排,圆盘移动时应遵守下列规则: (1)每次只能移动一个圆盘: (2)圆盘可插在x.y和z中任何一个塔座上: (3)任何时刻都不能将一个较大的圆盘压在较小的圆盘上面. 如下图所示为3阶Hanoi塔问题的初始状态. 完整代码: 1 #include <stdio.h> 2 3 void Hanoi(int n, char x, char y,

Acdream 1219 The Towers of Hanoi Revisited(递归汉诺塔问题)

传送门 The Towers of Hanoi Revisited Special Judge Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Submit Statistic Next Problem Problem Description You all must know the puzzle named "The Towers of Hanoi". The puzz

递归--汉诺塔问题 (Hanoi)

汉诺塔问题(Hanoi):古代有一个梵塔,塔内有三个座A.B.C,A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图).有一个和尚想把这64个盘子从A座移到C座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上.在移动过程中可以利用B座,要求输出移动的步骤 . 结题思路:利用递归思想结题,就是找出其每步的共同规律,然后必须有一步是递归的终止条件. 先假设第一种情况:3根柱,从左到右A,B,C,上面小号,底部大号,从上往下递增. 如要完成该任务,经历3

Hanoi塔问题(递归)

#include<iostream> #include<cstdio> using namespace std; int sum; int f(int n,char a,char b,char c){ if(n == 1){printf("1 from a to b\n");sum++;return sum;} else { f(n-1,a,c,b); printf("%d from %c to %c\n",n,a,c);sum++; f(n

递归汉诺塔

/*汉诺塔的玩法: * 游戏的规则:将A柱上的盘子移动到C柱上,大盘必须在小盘之上. * 1 当A柱上只有一个盘子的时候,直接移动到C柱上: * 2 当A柱上有两个盘子的时候, *   将A柱上的1盘(从上到下编号)移动到B柱, *   将A柱上的2盘移动到C柱, *   将B柱上的1盘移动到C柱: *   (将A上的1~n-1盘---->B柱,将A柱上n---->C柱,B柱上的1~n-1盘---->C柱) * 3 当A柱上有三个盘子的时候,将A柱上的1~2盘移动到B柱, *   将A柱

2017.11.26 计算机算法之分治与递归——汉诺塔

1.我的递归算法(纯粹的递归) #include <stdio.h>//当盘子数n等于15时,移动次数已经达到32767,运行时间已经达到15.540s long long count; void hanoi(int n,char a,char b,char c)//借助C将A上的盘子全部移动到B { if(n==0) return; hanoi(n-1,a,c,b); printf("%c --> %c\n",a,b); count++; hanoi(n-1,c,b