首页 > 其他分享 >汉诺塔

汉诺塔

时间:2023-02-16 22:11:39浏览次数:49  
标签:柱子 第一个 圆盘 第三个 汉诺塔 塔座 移动

汉诺塔是计算机学教科书中常用的游戏,用来说明递归的魔力。该游戏有3个柱子和一组不同大小的圆盘,柱子从圆盘的中心穿过。

题目描述

设abc是三个塔座,开始时,在塔座a 上有一叠共n个圆盘,这些圆盘自下而上,由大到小地叠放在一起,各圆盘从小到大编号为1,2,3,...,n。

现要求将塔座a 上的一叠圆盘移到塔座 b 上,并仍按同样顺序叠置。在移动圆盘是应遵守以下移动规则:

每次只能移动一个圆盘;
任何时刻都不允许将较大的圆盘压在较小的圆盘之上;
在满足移动规则1和2的前提下,可以将圆盘移至a,b,c中任一塔座上。
要求打印出出若干行,每行表示盘子的一次移动

如:1 a->c 表示将 a 号圆盘从 塔座移到 c 塔座

输入
一行:n表示表示初始时 a塔有 c 个圆盘

输出
未知行数

每行表示一次移动:

格式:圆盘编号 塔的编号->塔的编号

如:1 a->c 表示将 号圆盘从 a 塔座移到 c 塔座

样例输入
2
样例输出
1 A->C
2 A->B
1 C->B



游戏开始时,所有圆盘叠放在左侧第一个柱子上,如下图所示:

游戏的目标是将所有的圆盘从第一个柱子移动到第三个柱子,同时遵守以下规则:

① 除了被移动时,所有圆盘都必须放在柱子上。

② 一次只能移动一个圆盘。

③ 圆盘不能放置在比它小的圆盘上面。

现在来看一看游戏的一些玩法示例。最简单的情况是当只有一个圆盘时:在这种情况下,只要将圆盘从第一个柱子移动到第三个柱子就可以一次性完成游戏。

如果有两个圆盘,则需要通过 3 个步骤解决这个游戏:

① 将圆盘从第一个柱子移动到第二个柱子(它必须是最上面的一个)。

② 将圆盘从第一个柱子移动到第三个柱子。

③ 将圆盘从第二个柱子移动到第三个柱子。

请注意,虽然游戏的目的是将圆盘从第一个柱子移动到第三个柱子,但是有必要使用第二个柱子作为一些圆盘的临时安放位置。解决方案的复杂性随着要移动的圆盘数量的增加而迅速增加。

移动 3 个圆盘需要 7 步移动,如下图所示:

这个游戏有一个迷人的传说。根据这个传说,河内寺庙里有一群僧侣,他们有 3 个柱子和 64 个圆盘。这些圆盘最初堆放在第一个柱子上,而僧侣们则需要将它们移动到第三个柱子上。当僧侣们完成任务时,世界将会消亡。

现在回到这个问题本身,来考虑当圆盘的数量不做限制时,一般情况下的解决方案。

这个问题可以被描述为:将 n 个圆盘从第一个柱子移动到第三个柱子,使用第二个柱子作为临时柱子。

要理解如何使用循环解决这个问题是非常困难的,但令人高兴的是,设想一个递归解决方案并不困难:如果可以(递归地)将 n-1 个圆盘从第一个柱子移动到第二个柱子,而使用第三个柱子作为临时挂钩,那么最大的圆盘将独自放在第一个柱子上。然后就可以一次性把最大圆盘从第一个柱子移动到第三个柱子。接下来,可以(递归地)将 n-1 个圆盘从第二个柱子移动到第三个柱子,这次使用第一个柱子作为临时柱子。

so:

#include <bits/stdc++.h>
using namespace std;
void f(int n,char x,char y,char z)
{
	if(n==0) return;
	f(n-1,x,z,y);
	cout  <<n  << ' '<< x << "->" << z << endl;
	f(n-1,y,x,z);
}
int main()
{
	//	freopen(".in","r",stdin);
	//	freopen(".out","w",stdout);
	int n;
	cin >> n;
	f(n,'A','C','B');
	return 0;
}

标签:柱子,第一个,圆盘,第三个,汉诺塔,塔座,移动
From: https://www.cnblogs.com/momotrace/p/17128304.html

相关文章

  • 汉诺塔问题
    参考递归实现汉诺塔//汉诺塔递归版#include<stdio.h>//解决n个盘从a移到c,其中b为辅助的递归函数voidHanoi(intn,inta,intb,intc){//n:要移动的盘子的数量......
  • P1242 新汉诺塔
    新汉诺塔题目描述设有n个大小不等的中空圆盘,按从小到大的顺序从1到n编号。将这n个圆盘任意的迭套在三根立柱上,立柱的编号分别为A,B,C,这个状态称为初始状态......
  • P4285 [SHOI2008]汉诺塔
    [SHOI2008]汉诺塔题目描述汉诺塔由三根柱子(分别用A、B、C表示)和n个大小互不相同的空心盘子组成。一开始n个盘子都摞在柱子A上,大的在下面,小的在上面,形成了一个塔状的锥形......
  • 汉诺塔系列
    汉诺塔1:a上面的盘子借助b到c公式:n=2^n-1;#include<iostream>#include<cstdio>usingnamespacestd;voidf(intn,charA,charB,charC){if(n>=1){f(n......
  • #yyds干货盘点# LeetCode程序员面试金典:汉诺塔问题
    题目:在经典汉诺塔问题中,有3根柱子及N个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的......
  • 关于汉诺塔问题一些体会(大学复健的第一篇随笔)
    递归条件相同结构的子问题————考察子问题与当前问题的关系存在可以单独计算基础结构所以我们考察第一个条件,汉诺塔的移动方式第一步将所有上层移动到一......
  • 汉诺塔(经典递归问题)及个人目前的一些感想与心得
    汉诺塔(TowerofHanoi),又称河内塔,是一个源于​​​​印度​​​​​古老传说的​​​​益智玩具​​​​。​​​​大梵天​​​​创造世界的时候做了三根金刚石柱子,在一根柱......
  • 递归:汉诺塔问题
    问题背景汉诺塔问题源自印度一个古老的传说,印度教的“创造之神”梵天创造世界时做了3根金刚石柱,其中的一根柱子上按照从小到大的顺序摞着64个黄金圆盘。梵天命令一个叫......
  • 如何使用C语言实现汉诺塔
    现有3个柱子A、B、C,有n个圆盘在A柱上,要实现n个圆盘要从A柱从大到小移动到C柱。思路:先将n-1个圆盘移动到B柱上,然后将最后一个圆盘移动到C柱上,最后将B柱上的n-1个圆盘移动到C......
  • 面试题08. 06 汉诺塔
    问题链接https://leetcode.cn/problems/hanota-lcci/description/解题思路首先我们要定义递归函数。汉诺塔问题是典型的递归问题(缩小规模,小规模问题是大规模问题的子集),......