1.1. 说明
河内之塔(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的,河内为越战时北越的首都,即现在的胡志明市;1883年法国数学家 Edouard Lucas曾提及这个故事,据说创世纪时Benares有一座波罗教塔,是由三支钻石棒(Pag)所支撑,开始时神在第一根棒上放置64个由上至下依由小至大排列的金盘(Disc),并命令僧侣将所有的金盘从第一根石棒移至第三根石棒,且搬运过程中遵守大盘子在小盘子之下的原则,若每日仅搬一个盘子,则当盘子全数搬运完毕之时,此塔将毁损,而也就是世界末日来临之时。
1.2. 解法
如果柱子标为ABC,要由A搬至C,在只有一个盘子时,就将它直接搬至C,当有两个盘子,就将B当作辅助柱。如果盘数超过2个,将第三个以下的盘子遮起来,就很简单了,每次处理两个盘子,也就是:A->B、A ->C、B->C这三个步骤,而被遮住的部份,其实就是进入程式的递回处理。事实上,若有n个盘子,则移动完毕所需之次数为2^n - 1,所以当盘数为64时,则所需次数为:264- 1 = 18446744073709551615为5.05390248594782e+16年,也就是约5000世纪,如果对这数字没什幺概念,就假设每秒钟搬一个盘子好了,也要约5850亿年左右。
C语言代码:
#include <stdio.h>
void hanoi(int n, char A, char B, char C) {
if(n == 1) {
printf("Move sheet %d from %c to %c\n", n, A, C);
}
else {
hanoi(n-1, A, C, B);
printf("Move sheet %d from %c to %c\n", n, A, C);
hanoi(n-1, B, A, C);
}
}
int main() {
int n;
printf("请输入盘数:");
scanf("%d", &n);
hanoi(n, 'A', 'B', 'C');
return 0;
}
Java代码:
package test;
public class Hanoi
{
/**
* 将n层的盘子从a地搬到c地 ,必须按照大的在下小的在上的方式放置
* @param layers
* @param placea
* @param placeb
* @param placec
*/
public static void move(int layers, String placea, String placeb, String placec)
{
if (layers == 1)
{
System.out.println("Move dish " + layers + " from " + placea + " to " + placec);
}
else
{
Hanoi.move(layers-1,placea,placec,placeb);
System.out.println("Move dish " + layers + " from " + placea + " to " + placec);
Hanoi.move(layers-1, placeb, placea, placec);
}
}
public static void main(String[] args)
{
Hanoi.move(3, "a", "b", "c");
}
}
分享到:
相关推荐
汉诺伊塔,又称Hannoi塔,是一个经典的递归问题和计算机科学中的算法示例。这个谜题由三个柱子和一堆不同大小的圆盘组成。目标是将所有圆盘从一个柱子(通常称为起始柱)移动到另一个柱子(目标柱),遵循以下规则:...
汉诺塔---速度很快的非递归法算法,排序算法数据结构 最快的排序算法
---汉诺塔源代码--- ---汉诺塔源代码--- ---汉诺塔源代码--- ---汉诺塔源代码--- ---汉诺塔源代码---
汉诺伊塔(Hanoi Tower)是一个经典的计算机科学问题,源于19世纪由法国数学家艾德蒙·朗利提出。这个问题是关于如何通过一系列移动将一个塔中的所有圆盘从一根柱子移动到另一根柱子,同时遵循三个简单规则: 1. ...
汉诺塔(Hanoi Tower)是一款经典的逻辑游戏,源自19世纪由法国数学家艾德蒙·洛卡特(Edouard Lucas)提出的数学问题。它通常由三根圆柱和一堆不同大小的圆盘组成,玩家的目标是将所有圆盘从一根柱子移动到另一根...
汉诺塔问题是一个经典的计算机科学问题,源自一个古老的印度传说。该问题涉及到三根柱子和一堆盘子,目标是将所有盘子从第一根柱子(A柱)移动到第三根柱子(C柱),但每次只能移动一个盘子,并且任何时候大盘子都不...
汉诺塔(Hanoi Tower)是一个经典的递归问题,源于19世纪法国数学家爱德华·卢卡斯提出的智力游戏。游戏的目标是将一座由大小不等的圆盘堆叠而成的塔从一个柱子(起始柱)移动到另一个柱子(目标柱),在移动过程中...
汉诺塔java源码河内塔 嗨,这是一个用 Java 编写的简单 GUI 应用程序,用于演示如何以最少的步骤数(即 2 n -1 步)解决难题。 源代码在 Towers-of-Hanoi/src/src/towersofhanoi/ 它由两个类组成, 基本GUI.java ...
汉诺塔(Hanoi Tower)是一个经典的递归问题,源于19世纪法国数学家艾德蒙·朗利提出的一个挑战。在这个问题中,有三根柱子和一堆大小不一的圆盘,圆盘在最下面大,往上逐渐变小。目标是将所有圆盘从第一根柱子...
汉诺塔游戏是一种经典的递归算法问题,源自印度的一个古老传说。在这个游戏中,有三根柱子和一堆不同大小的圆盘,每盘都比下一层的盘子小。目标是将所有圆盘从第一根柱子(源柱)移动到第三根柱子(目标柱),但每次...
汉诺塔是一个经典的递归问题,它源自印度的一个古老传说,目标是将一叠盘子从一根柱子(称为起始柱)移动到另一根柱子(称为目标柱),但每次只能移动一个盘子,并且任何时候大盘子都不能位于小盘子之上。...
汉诺塔(Hanoi)问题是一个经典的递归问题,源于法国数学家爱德华·卢卡斯在19世纪末提出的智力游戏。这个游戏涉及到三根柱子和一堆大小不一的圆盘,每根柱子上可以放置圆盘。游戏的目标是将所有圆盘从第一根柱子...
汉诺塔(Hanoi Tower),又称为河内塔或汉诺塔游戏,是一个源于印度的古老智力游戏。它由三根柱子及不同大小的圆盘组成,初始时所有圆盘都穿在第一根柱子上,并且遵循从大到小的顺序排列。游戏的目标是把所有的圆盘...
汉诺伊塔问题,也称为汉诺伊塔塔或汉诺伊柱,是一个经典的计算机科学问题,它展示了递归算法的应用。在这个问题中,有三根柱子和若干个大小不一的圆盘,所有圆盘最初都放在第一根柱子上,目标是将所有的圆盘移动到第...
汉诺塔java源码河内 出于我对递归的兴趣(以及早期理解上的挣扎)而产生的一个小练习。 虽然一般递归 - 尤其是著名的河内塔问题 - 是早期 CS 课程中常见的概念,但我发现我(和我的许多同事)很早就在这个概念上挣扎...
汉诺塔问题是一个经典的计算机科学问题,源自印度的古老传说,它涉及到将一叠盘子从一根柱子移动到另一根柱子,遵循特定的规则。在这个非递归的Java程序实现中,我们主要探讨如何用非递归算法解决汉诺塔问题。 首先...
汉诺塔问题是一个经典的计算机科学问题,源自印度的古老传说,通常用来介绍递归思想。在汉诺塔问题中,有三根柱子和一堆大小不一的圆盘,所有圆盘都放在第一根柱子上,按照由大到小的顺序自上而下排列。目标是将所有...
汉诺塔java源码河内塔 Java河内之塔游戏 Swing Gui、Sound 和 SQL 链接的排行榜 下载、解压、运行: 更新:代码已调整,因此 jdbc 驱动程序现在位于程序文件文件夹中。 此 jar 未上传到 github,因此如果克隆 repo,...
Hanoi(汉诺)塔问题。这是一个古典的数学问题,是一个用递归方法解决问题的典型例子。问题是这样的:古代有一个梵塔,塔内有3个座A、B、C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚...
汉诺塔是一个经典的递归问题,它源自印度的一个古老传说,涉及将一组圆盘从一根柱子移动到另一根柱子,遵循特定的规则。在这个问题中,有三根柱子,标记为 A、B 和 C,以及 n 个大小不一的圆盘,每个圆盘都标有不同...