package org.bestupon.algorithm;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
*
* @author BestUpon
* @email bestupon@foxmail.com
* @date 2010-5-28下午09:57:20
* @ask 据说创世纪时Benares有一座波罗教塔,是由三支钻石棒(Pag)所支撑,开始时神在第一根棒上放置64个由上至下依由小至大排列的金盘
* (Disc),并命令僧侣将所有的金盘从第一根石棒移至第三根石棒,且搬运过程中遵守大盘子在小盘子之下的原则,若每日仅搬一个盘子,
* 则当盘子全数搬运完毕之时,此塔将毁损,而也就是世界末日来临之时。
* @answer 如果柱子标为ABC,要由A搬至C,在只有一个盘子时,就将它直接搬至C,当有两个盘子,就将B当作辅助柱。如果盘数超过2个,
* 将第三个以下的盘子遮起来,就很简单了,每次处理两个盘子,也就是:A->B、A ->C、B->C这三个步骤,而被遮住的部份,
* 其实就是进入程序的递归处理。事实上,若有n个盘子,则移动完毕所需之次数为2^n-1,所以当盘数为64时, 则所需次数为:
* 2^64- 1 =18446744073709551615 为5.05390248594782e+16年,也就是约5000世纪,
* 如果对这数字没什么概念,就假设每秒钟搬一个盘子好了,也要约5850亿年左右。
* @next 对于这类的问题,一般都是递归的解决办法,如何实现将递归问题非递归化?思考中...
*/
public class Towers_of_Hanoi {
public static void main(String[] args) {
int discNum = 3;
BufferedReader input = null;
input = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入柱子的数目:");
String discNumStr = "3";
try {
discNumStr = input.readLine();
discNum = Integer.parseInt(discNumStr);
} catch (NumberFormatException e) {
discNum = 3;
System.out.println("你输入的" + discNumStr + "不是数字!默认取值3个盘子");
} catch (IOException e) {
e.printStackTrace();
}
Towers_of_Hanoi.moveDisc(discNum, "A", "B", "C");
}
/**
*
* @param discNum
* 盘子的数量
* @param pagA
* 柱子A 源柱子
* @param pagB
* 柱子B 辅助柱子
* @param pagC
* 柱子C 目的柱子
*/
private static void moveDisc(int discNum, String pagA, String pagB,
String pagC) {
if (discNum == 1) {
/*
* 如果是盘子数是一个的话,直接将这个盘子移动到柱子C就可以了
*/
System.out.println("盘 " + discNum + " 由 " + pagA + " 移至 " + pagC);
} else {
/*
* 如果有2个盘子的话,要以pagB做辅助,首先将最上面的disc1 移至pagB,在将disc2移至pagC,
* 接着将disc1移至pagC。如果盘数超过2个, 将第3个以下的盘子遮起来,就很简单了,每次处理2个盘子,
* 也就是:pagA->pagB、pagA->pagC、pagB->pagC这三个步骤,而被遮住的部份, 其实就是进入程序的递归处理。
* 事实上,若有n个盘子,则移动完毕所需之次数为2^n-1
*/
moveDisc(discNum - 1, pagA, pagC, pagB);// 做pagA->pagB的操作
System.out.println("盘 " + discNum + " 由 " + pagA + " 移至 " + pagB);
moveDisc(discNum - 1, pagB, pagA, pagC);// 做pagB->pagC的操作
/**
* 其中pagA->pagC 的过程是迭代的过程
*/
}
}
}
分享到:
相关推荐
在C++ Builder环境下,利用C++语言和线程技术来动态演示汉诺塔算法,可以帮助用户直观地理解和学习这个算法。 首先,我们来深入理解汉诺塔问题。它包括三个柱子和一堆大小不一的圆盘,初始时所有圆盘都在第一个柱子...
这是个汉诺塔程序,在调试的时候,输入的数字最好不要大于15,因为每大一个数 所得的结果的步骤都会多一倍。如果你有耐心等待结果的话除外。汉诺塔是在欧洲 流行的一种游戏,有a,b,c三个竿。a竿上有若干个由大到小的...
### 数据结构与汉诺塔算法详解 #### 一、汉诺塔问题背景及定义 汉诺塔(Tower of Hanoi)是一种源自法国的数学游戏,由埃德华·卢卡斯于1883年发明。它由三根杆子及不同大小的圆盘组成,所有圆盘最初都放在同一根...
汉诺塔的算法流程 仅供参考,本程序,可以实现N个盘子的汉诺塔排序,并在屏幕上显示操作步骤
汉诺塔(Hanoi Tower)算法,又称为巴黎塔问题,是计算机科学中一个经典的递归问题。这个算法源于一个古老的印度传说,涉及到三个柱子和一堆大小不一的圆盘。目标是将所有圆盘从一个柱子移动到另一个柱子,每次只能...
汉诺塔 (又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放...
汉诺塔问题的解决方案通常采用递归算法来实现,这是因为问题本身具有自然的递归性质。下面我们将详细探讨递归解法: **递归算法解释:** 假设我们有n个圆盘,我们可以按照以下步骤将它们从柱子A移动到柱子C,利用...
### 汉诺塔问题算法及其实现 #### 概述 汉诺塔问题是一个经典的递归算法案例,它不仅在计算机科学领域有着广泛的应用,同时也被用来教授递归思想的基础知识。这个问题最早由法国数学家Édouard Lucas于1883年提出,...
描述中的"给出了计算结果和塔盘移动过程"意味着这个源码不仅实现了汉诺塔算法,还可能包含可视化界面,能够动态显示每个步骤,帮助初学者更好地理解这个过程。通过这样的可视化演示,用户可以直观地看到每个圆盘的...
汉诺塔算法的递归与非递归实现 汉诺塔算法是程序设计中的经典递归问题,来源于印度古老的传说。问题的描述是:有三根金刚石的棒,第一根上面套着 64 个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,...
知道汉诺塔的同学,有想知道其中原理的,可以看看,一个小游戏,需要源码的发邮件至:568954956@qq.com,VS2010
这个程序是汉诺塔算法的可视化软件,如果在学习这个算法但是始终搞不清时可以使用这个软件帮助理解。
在这个名为"archive_VC++汉诺塔算法.zip.zip"的压缩包中,包含了一个VC++编写的汉诺塔算法实现,以及一个名为"output.txt"的文件,可能是运行程序后的输出结果或日志。 首先,我们来详细解释汉诺塔问题。汉诺塔游戏...
汉诺塔算法 C++ 有截图 结果如下: 请输入盘子数:4 各步骤如下: A-->B A-->C B-->C A-->B C-->A C-->B A-->B A-->C B-->C B-->A C-->A B-->C A-->B A-->C B-->C 总步骤数为:15 Press any key to continue
一步步演示汉诺塔算法的执行流程
汉诺塔算法的演示,比较简单
在VC++环境中实现汉诺塔算法,我们可以利用C++语言的特性,特别是递归函数,来解决这个问题。这个压缩包文件“VC++汉诺塔算法.7z”可能包含了一个完整的VC++项目,用于演示如何用C++编程实现汉诺塔游戏的解决方案。 ...
- **M 根柱子的汉诺塔问题**:当柱子数量M为3时,可以使用经典的汉诺塔算法,即 pow(2,n) - 1 的公式计算最少移动次数。对于M不等于3的情况,使用递归策略,通过计算不同分割点的最少移动次数并找到最小值。 - **...