ybt1205汉诺塔问题

ybt1205 汉诺塔问题

寒假不断更计划!

【题目描述】

约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下、由小到大顺序串着由64个圆盘构成的塔。目的是将最左边杆上的盘全部移到中间的杆上,条件是一次只能移动一个盘,且不允许大盘放在小盘的上面。

这是一个著名的问题,几乎所有的教材上都有这个问题。由于条件是一次只能移动一个盘,且不允许大盘放在小盘上面,所以64个盘的移动次数是:18,446,744,073,709,551,615

这是一个天文数字,若每一微秒可能计算(并不输出)一次移动,那么也需要几乎一百万年。我们仅能找出问题的解决方法并解决较小N值时的汉诺塔,但很难用计算机解决64层的汉诺塔。

假定圆盘从小到大编号为1, 2, ...

【输入】

输入为一个整数(小于20)后面跟三个单字符字符串。

整数为盘子的数目,后三个字符表示三个杆子的编号。

【输出】

输出每一步移动盘子的记录。一次移动一行。

每次移动的记录为例如 a->3->b 的形式,即把编号为3的盘子从a杆移至b杆。

【输入样例】

2 a b c

【输出样例】

a->1->c a->2->b c->1->b

【题解】

首先先高兴一波,我ybt题库排名20000-了!(菜鸡自嗨)

说实在,这道题一开始贾大佬(她的博客)(当然,里面没有辣鸡汉诺塔)讲的时候我是连标程都没看懂,后来才大彻大悟的。

规则上面已经说了,接下来是解题的思路,先从真正玩这个游戏的策略入手:

我们既然要将所有圆盘都移走,那么就要将最大的圆盘上面的先移到另外一个柱子上,然后再将最大圆盘移到目标盘子,最后再将剩下的盘子移到移动完毕的最大盘子。

这样我们就可以将原问题分解为三部分,把最大的盘子成为底盘,其余盘子称为尖顶。

下面有请:全网最火毁灭哥来介绍利用hanoi塔毁灭世界的方法:

毁灭世界有三步

Step1:拿走尖顶

Step2:移动底盘

Step3:把尖顶放回去

怎么样,是不是很简单,小伙伴们赶紧回家毁灭一下试试吧!

不过话虽这么说,但是就算是用计算机(学校机房的标压奔腾),一秒钟只能算出移动30个圆盘的移动(不输出),所以这里只讨论n<20时的情况

前面说过,如果有n个圆盘,那么问题就成了将n-1个圆盘拿走,移动第n个圆盘,再将n-1个圆盘放回的情况。递归边界就是只拿走一个的情况,此时只要把要移动的圆盘直接拿到目标杆子上即可。这样就可以写出递归函数:

void hanoi(int n,char A,char B,char C)//这里的A为起始杆,B为目标杆,C为终点杆
{
    if (n==1)
    {
        printf("%c->%d->%c\n",A,n,B);//直接拿过去,不跟他多bibi
        return;//递归边界
    }
    hanoi(n-1,A,C,B);//将n-1个盘子从A移到C(给大佬(本次最大圆盘)让道加让座)
    printf("%c->%d->%c\n",A,n,B);//本次操作的核心:将本次最大圆盘直接移至目标杆
    hanoi(n-1,C,B,A);//将n-1个盘子从C移回到B(移动完的最大圆盘所在地)
    return;
}

接下来是供你们直接复制的完整代码:

#include <iostream>
#include <cstdio>
using namespace std;
void hanoi(int n,char A,char B,char C)
{
    if (n==1)
    {
        printf("%c->%d->%c\n",A,n,B);
        return;
    }
    hanoi(n-1,A,C,B);
    printf("%c->%d->%c\n",A,n,B);
    hanoi(n-1,C,B,A);
    return;
}
int main()
{
    char A,B,C;
    int n;
    cin>>n>>A>>B>>C;
    hanoi(n,A,B,C);
    return 0;
}

真好,又水了一篇博文

原文地址:https://www.cnblogs.com/Wild-Donkey/p/12229834.html

时间: 2024-12-11 07:56:30

ybt1205汉诺塔问题的相关文章

hdu 1207 汉诺塔II (DP+递推)

汉诺塔II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4529    Accepted Submission(s): 2231 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往

从汉诺塔问题来看“递归”本质

汉诺塔问题 大二上数据结构课,老师在讲解"栈与递归的实现"时,引入了汉诺塔的问题,使用递归来解决n个盘在(x,y,z)轴上移动. 例如下面的动图(图片出自于汉诺塔算法详解之C++): 三个盘的情况: 四个盘的情况: 如果是5个.6个.7个....,该如何移动呢? 于是,老师给了一段经典的递归代码: void hanoi(int n,char x,char y,char z){ if(n == 1) move(x,1,z); else{ hanoi(n-1,x,z,y); move(x,

bzoj1019: [SHOI2008]汉诺塔(dp)

1019: [SHOI2008]汉诺塔 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1739  Solved: 1062[Submit][Status][Discuss] Description 汉诺塔由三根柱子(分别用A B C表示)和n个大小互不相同的空心盘子组成.一开始n个盘子都摞在柱子A上,大的在下面,小的在上面,形成了一个塔状的锥形体. 对汉诺塔的一次合法的操作是指:从一根柱子的最上层拿一个盘子放到另一根柱子的最上层,同时要保证被移动的

汉诺塔(三)

汉诺塔(三) 描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面.僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔.庙宇和众生也都将同归于尽. 现在我们把三根针编号为1,2,3. 所

python 实现汉诺塔问题

代码如下: def hano(n,x,y,z): if n==1: print(x,"->",z) else: #将n-1个盘子从x->y hano(n-1,x,z,y) #将剩余的最后一个盘子从x->z print(x,"->",z) #将剩余的n-1个盘子从y->z hano(n-1,y,x,z) n = int(input("请输入汉诺塔的层数:")) hano(n,"A","B&

NYOJ 93 汉诺塔(三) 【栈的简单应用】

汉诺塔(三) 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描写叙述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候.在当中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔. 不论白天黑夜,总有一个僧侣在依照以下的法则移动这些金片:一次仅仅移动一片.无论在哪根针上.小片必须在大片上面.僧侣们预言.当全部的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中

汉诺塔的递归算法与解析

从左到右 A  B  C 柱 大盘子在下, 小盘子在上, 借助B柱将所有盘子从A柱移动到C柱, 期间只有一个原则: 大盘子只能在小盘子的下面. 如果有3个盘子, 大中小号, 越小的越在上面, 从上面给盘子按顺序编号 1(小),2(中),3(大), 后面的原理解析引用这里的编号. 小时候玩过这个游戏, 基本上玩到第7个,第8个就很没有耐心玩了,并且操作的动作都几乎相同觉得无聊.  后来学习编程, 认识到递归, 用递归解决汉诺塔的算法也是我除了简单的排序算法后学习到的第一种算法. 至于递归,简单来说

BZOJ 1019: [SHOI2008]汉诺塔

Description 一个汉诺塔,给出了移动的优先顺序,问从A移到按照规则移到另一个柱子上的最少步数. 规则:小的在大的上面,每次不能移动上一次移动的,选择可行的优先级最高的. Sol DP. 倒着DP.但是他有优先级,所以他的方案是唯一的. 状态 \(f[a][i]\) 表示 将 \(a\) 柱上的 \(i\) 个移到,能移动到的柱子上的步数. 他能移动到的柱子也是唯一的,这个可以跟DP一起递推出来. \(g[a][j]\) 表示 将 \(a\) 柱上的 \(i\) 个能移动到的柱子. 然后

汉诺塔-Hanoi

1. 问题来源: 汉诺塔(河内塔)问题是印度的一个古老的传说. 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面.僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔.