【数据结构】2、汉诺塔

/*
*功能:假设有3个塔座x y z,在x上插有n个直径大小各不相同、从小到大编号为1 - n的圆盘,要求将x轴上的n个圆盘移动到z轴并按同样顺序排列,移动圆盘须遵循以下规则:
 1)、每次只能移动一个圆盘;
 2)、圆盘可插在x y z中的任一塔座上;
 3)、任何时刻不能将一个较大的圆盘压在较小的圆盘上;
*文件:hanoi.cpp
*时间:2015年7月6日20:22:29
*作者:cutter_point
*/

#include <iostream>

using namespace std;

/*
这里写一个move函数
*/
void move(char a, int n, char b)
{
	//这个函数就表示吧n号圆盘从a移动到b
	cout << "我们把" << n << "号圆盘从" << a << "========>" << b << endl;
}

/*
这个函数是使用递归来调用汉诺塔,这个函数的功能是吧n个圆盘从x借助y移动到z
*/
void hanoi(int n, char x, char y, char z)
{
	//将塔坐X上按直径由小到大且自上而下编号为1至n的n个圆盘按规则搬到塔座z上,y可用作辅助塔座
	//搬动操作move(x, n, z)可定义为(c是初值为0的全局变量,对搬动计数):
	if (n == 1) //当n为1的时候,也就是递归到只剩下1个圆盘的时候了
	{//我们就需要把编号为1的圆盘从x移动到z就对了
		move(x, 1, z);
	}
	else
	{
		//如果x上所剩下的圆盘不止1,那么
		//首先我们把上面n-1个圆盘移动到y,吧z作为辅助底座
		hanoi(n - 1, x, z, y);
		//然后把最后那个最大的圆盘移动到z
		move(x, n, z);
		//最后再借助x吧y上的n-1个圆盘移动到z盘
		hanoi(n - 1, y, x, z);
	}
}
int main()
{
	int n = 10;
	char x, y, z;
	x = 'A';
	y= 'B';
	z = 'C';

	hanoi(n, x, y, z);

	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 16:21:36

【数据结构】2、汉诺塔的相关文章

数据结构0103汉诺塔&amp;八皇后

主要是从汉诺塔及八皇后问题体会递归算法. 汉诺塔: #include <stdio.h> void move(int n, char x,char y, char z){ if(1==n) { printf("%c-->%c\n",x,z); } else { move(n-1,x,z,y); //将n-1个盘子从x借助z移到y上 printf("%c-->%c\n",x,z); //将第n个盘子从x移到z上 move(n-1,y,x,z);

数据结构之汉诺塔问题

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘.  ——摘自百度百科 汉诺塔之三个盘子,需要几步 汉诺塔之四个盘子,需要几步? 汉诺塔之二十个盘子,需要几步? 原文地址:https://www.cnblogs.com/l-x-x-y-d-j/p/1137

【算法与数据结构】汉诺塔问题Java实现

思路:递归 [代码] 1 public class Main { 2 public static void hanoi(int n, int x, int y, int z) { 3 if (n == 1) { 4 System.out.print(x + "----->" + z); 5 }else { 6 hanoi(n - 1, x, z, y);//把前面n-1个移动到y上 7 System.out.print(x + "----->" + y)

16、蛤蟆的数据结构笔记之十六栈的应用之栈与递归之汉诺塔问题

16.蛤蟆的数据结构笔记之十六栈的应用之栈与递归之汉诺塔问题 本篇名言:"人生的价值,并不是用时间,而是用深度去衡量的." 继续栈与递归应用,汉诺塔问题. 欢迎转载,转载请标明出处: 1.  汉诺塔问题 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一

数据结构与算法—递归(阶乘、斐波那契、汉诺塔)

目录 递归介绍 递归求阶乘 递归求斐波那契 递归解决汉诺塔 总结 递归介绍 递归:就是函数自己调用自己. 子问题须与原始问题为同样的事,或者更为简单:递归通常可以简单的处理子问题,但是不一定是最好的.对于递归要分清以下概念: 自己调用自己 递归通常不在意具体操作,只关心初始条件和上下层的变化关系. 递归函数需要有临界停止点,即递归不能无限制的执行下去.通常这个点为必须经过的一个数. 递归通常能被其他方案替代(栈.数组正向求). 认识递归,递归函数通常简易但是对于初学者可能很难取理解它.拿一个递归

数据结构---汉诺塔

/*汉诺塔:A座有n个盘子,下面直径比上面大,要借助C座,将n个盘子移到B上,移动过程中大盘子一定在小盘子下面*/ package pack; public class Main { static int n = 10; public static void main(String[] args) { han(n,'A','B','C'); //将n个盘子借助C,从A到B } public static void han(int n,char a,char b,char c) { if(n==1

【数据结构与算法】汉诺塔算法——java递归实现

汉诺塔的递归实现算法,将A中的圆盘借助B圆盘完全移动到C圆盘上, 每次只能移动一个圆盘,并且每次移动时大盘不能放在小盘上面 递归函数的伪算法为如下: if(n == 1)    直接将A柱子上的圆盘从A移动到C else    先将A柱子上的n-1个圆盘借助C柱子移动到B柱子上    直接将A柱子上的第n个圆盘移动到C柱子上    最后将B柱子上的n-1个圆盘借助A柱子移动到C柱子上 该递归算法的时间复杂度为O(2的n次方),当有n个圆盘时,需要移动圆盘2的n次方-1次 public class

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

汉诺塔的问题,也是一个经典的递归算法问题. 下面是自己总结的一张整体流程图. 下面是代码,代码虽简单,但理解其内部运行原理很重要. //====================================================================== // // Copyright (C) 2014-2015 SCOTT // All rights reserved // // filename: HanNuoTa.c // description: a demo to

数据结构(java语言描述)递归实现——汉诺塔问题

1.汉诺塔问题描述 N阶汉诺塔:假设有3个分别命名为x,y,z的三个塔座,在x上有n个盘子,直径大小不同,有小到大按标号1,2,3...n排列,要借助y将n个盘子转移到z上,期间不能让小盘子压在大盘子上.规则: 每次至移动一个盘子: 盘子可以插在x,y,z任意一个塔座上: 任何时候都不能将大盘压在小盘上. 2.解题思路 当n=1时,直接把盘子由x——>z; 当n>1时,需利用y,首先将(n-1)个盘子由x——>y,把第n个实现x——>z,然后把问题转换为实现(n-1)个盘子由y——