问题 C 算法3-5:n阶Hanoi塔问题

原创 2016年10月24日 23:31:27

题目描述

假设有三个分别命名为X、Y和Z的塔座,在塔座X上插有n个直径大小各不相同、依小到大编号为1,2,...,n的圆盘。现要求将X轴上的n个圆盘移至塔座Z上并仍按同样顺序叠排,圆盘移动时必须遵循下列规则: 1)每次只能移动一个圆盘; 2)圆盘可以插在X、Y和Z中的任一塔座上; 3)任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。 如何实现移动圆盘的操作呢?当n=1时,问题比较简单,只要将编号为1的圆盘从塔座X直接移至塔座Z上即可;当n>1时,需利用塔座Y作辅助塔座,若能设法将压在编号为n的圆盘之上的n-1个圆盘从塔座X(依照上述法则)移至塔座Y上,则可先将编号为n的圆盘从塔座X移至塔座Z上,然后再将塔座Y上的n-1个圆盘(依照上述法则)移至塔座Z上。而如何将n-1个圆盘从一个塔座移至另一个塔座的问题是一个和原问题具有相同特征属性的问题,只是问题的规模小1,因此可以用同样的方法求解。由此可得如下图算法所示的求解n阶Hanoi塔问题的C函数。

图:求解n阶Hanoi塔问题的C函数

现在就请你将上述算法实现吧。

输入

输入数据有多组,每组1个整数n,表示Hanoi塔的阶数。

输出

将每次移动(move)按照以下格式输出:%2d. Move disk %d from %c to %c\n
上述格式中第一个整数表示第几次移动,第二个整数表示移动第几个圆盘,后两个字符表示将圆盘从哪个塔座移至哪个塔座上。每组输出后面输出一个空行。

样例输入

123

样例输出

1. Move disk 1 from X to Z 1. Move disk 1 from X to Y 2. Move disk 2 from X to Z 3. Move disk 1 from Y to Z 1. Move disk 1 from X to Z 2. Move disk 2 from X to Y 3. Move disk 1 from Z to Y 4. Move disk 3 from X to Z 5. Move disk 1 from Y to X 6. Move disk 2 from Y to Z 7. Move disk 1 from X to Z


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
#include<math.h>
int i=1;
void move(int n,char from,char to){
    printf("%2d. Move disk %d from %c to %c\n",i++,n,from,to);
}
void hanoi(int n,char from,char dep,char to){
    if(n==1){
        move(1,from,to);
    }
    else{
        hanoi(n-1,from,to,dep);
        move(n,from,to);
        hanoi(n-1,dep,from,to);
    }
}
int main(){
    int num;
    while(scanf("%d",&num)==1){
        char a='X',b='Y',c='Z';
        hanoi(num,a,b,c);
        printf("\n");
        i=1;
    }
    return 0;
}


版权声明:本文为博主原创文章,可以随意转载。

用递归法:设计算法求解汉诺塔问题,并编程实现。 (1) Hanoi(汉诺)塔问题分析 这是一个古典的数学问题,是一个用递归方法解题的典型例子。问题是这样的:古代有一个梵塔,塔内有3个座 A,B,C

用 递归法:设计算法求解汉诺塔问题,并编程实现。 (1) Hanoi(汉诺)塔问题分析 这是一个古典的数学问题,是一个用递归方法解题的典型例子。问题是这样的:古代有一个梵塔,塔内有3个座 A,B,...
  • u011329762
  • u011329762
  • 2014年11月11日 18:31
  • 7186

hanoi塔问题解析(一) c++实现

什么是hanoi塔? 汉诺塔问题:古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个和尚想把这64个盘子从A座移到B座,但每次只能允许移动一个盘子...
  • woshinannan741
  • woshinannan741
  • 2016年10月14日 19:10
  • 3062

n阶Hanoi塔问题 - 算法设计与分析实验1

由于实验指导书上没有给出具体的问题描述,这里把ACM的算法描述列了出来:问题: 假设有三个分别命名为X、Y和Z的塔座,在塔座X上插有n个直径大小各不相同、依小到大编号为1,2,…,n的圆盘。现要求将X...
  • Chen_dSir
  • Chen_dSir
  • 2017年12月11日 11:41
  • 59

算法与设计实验1:N阶Hanoi塔问题

由于实验指导书上没有给出具体的问题描述,这里把ACM的算法描述列了出来: 问题: 假设有三个分别命名为X、Y和Z的塔座,在塔座X上插有n个直径大小各不相同、依小到大编号为1,2,...,n的圆...
  • Chen_dSir
  • Chen_dSir
  • 2017年12月11日 11:32
  • 111

n阶汉诺塔盘问题(Hanoi)

n阶汉诺塔盘问题
  • lvdezhou
  • lvdezhou
  • 2015年12月11日 13:32
  • 690

形式化开发Hanoi塔问题非递归算法

  • 2014年10月21日 18:48
  • 417KB
  • 下载

Hanoi塔问题的一种非递归算法

  • 2007年03月30日 21:38
  • 202KB
  • 下载

Hanoi塔问题非递归算法的形式推导

  • 2008年02月16日 14:07
  • 209KB
  • 下载

java算法分析与设计之Hanoi塔问题源代码

  • 2012年11月23日 17:10
  • 1KB
  • 下载

算法分析——Hanoi塔问题(还是写不出来啊!)

上图为 3 阶 Hanoi 塔 假设有三个命名为 A B C 的塔座 ,在塔座A上插有n个直径大小不相同,由小到大编号为1 ,2 ,3 ,··· ,n的圆盘,要求将A座上的圆盘移至塔座C ...
  • PengPengBlog
  • PengPengBlog
  • 2016年10月27日 14:19
  • 323
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:问题 C 算法3-5:n阶Hanoi塔问题
举报原因:
原因补充:

(最多只允许输入30个字)