`
BestUpon
  • 浏览: 290775 次
  • 性别: Icon_minigender_1
  • 来自: 兰州
社区版块
存档分类
最新评论

汉诺塔算法

阅读更多

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++ Builder环境下,利用C++语言和线程技术来动态演示汉诺塔算法,可以帮助用户直观地理解和学习这个算法。 首先,我们来深入理解汉诺塔问题。它包括三个柱子和一堆大小不一的圆盘,初始时所有圆盘都在第一个柱子...

    c语言 汉诺塔 算法

    这是个汉诺塔程序,在调试的时候,输入的数字最好不要大于15,因为每大一个数 所得的结果的步骤都会多一倍。如果你有耐心等待结果的话除外。汉诺塔是在欧洲 流行的一种游戏,有a,b,c三个竿。a竿上有若干个由大到小的...

    数据结构 汉诺塔算法

    ### 数据结构与汉诺塔算法详解 #### 一、汉诺塔问题背景及定义 汉诺塔(Tower of Hanoi)是一种源自法国的数学游戏,由埃德华·卢卡斯于1883年发明。它由三根杆子及不同大小的圆盘组成,所有圆盘最初都放在同一根...

    汉诺塔算法简单实现步骤

    汉诺塔的算法流程 仅供参考,本程序,可以实现N个盘子的汉诺塔排序,并在屏幕上显示操作步骤

    汉诺塔算法演示程序

    汉诺塔(Hanoi Tower)算法,又称为巴黎塔问题,是计算机科学中一个经典的递归问题。这个算法源于一个古老的印度传说,涉及到三个柱子和一堆大小不一的圆盘。目标是将所有圆盘从一个柱子移动到另一个柱子,每次只能...

    汉诺塔算法带UI动画显示

    汉诺塔 (又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放...

    c语言汉诺塔算法,递归,非递归

    汉诺塔问题的解决方案通常采用递归算法来实现,这是因为问题本身具有自然的递归性质。下面我们将详细探讨递归解法: **递归算法解释:** 假设我们有n个圆盘,我们可以按照以下步骤将它们从柱子A移动到柱子C,利用...

    汉诺塔问题算法以及实现

    ### 汉诺塔问题算法及其实现 #### 概述 汉诺塔问题是一个经典的递归算法案例,它不仅在计算机科学领域有着广泛的应用,同时也被用来教授递归思想的基础知识。这个问题最早由法国数学家Édouard Lucas于1883年提出,...

    汉诺塔算法教学源码,给出了计算结果和塔盘移动过程

    描述中的"给出了计算结果和塔盘移动过程"意味着这个源码不仅实现了汉诺塔算法,还可能包含可视化界面,能够动态显示每个步骤,帮助初学者更好地理解这个过程。通过这样的可视化演示,用户可以直观地看到每个圆盘的...

    汉诺塔算法的递归与非递归的C以及C++源代码.doc

    汉诺塔算法的递归与非递归实现 汉诺塔算法是程序设计中的经典递归问题,来源于印度古老的传说。问题的描述是:有三根金刚石的棒,第一根上面套着 64 个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,...

    汉诺塔算法 和游戏实例

    知道汉诺塔的同学,有想知道其中原理的,可以看看,一个小游戏,需要源码的发邮件至:568954956@qq.com,VS2010

    汉诺塔算法的可视化程序

    这个程序是汉诺塔算法的可视化软件,如果在学习这个算法但是始终搞不清时可以使用这个软件帮助理解。

    archive_VC++汉诺塔算法.zip.zip

    在这个名为"archive_VC++汉诺塔算法.zip.zip"的压缩包中,包含了一个VC++编写的汉诺塔算法实现,以及一个名为"output.txt"的文件,可能是运行程序后的输出结果或日志。 首先,我们来详细解释汉诺塔问题。汉诺塔游戏...

    汉诺塔算法 C++

    汉诺塔算法 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

    汉诺塔算法演示PPT

    一步步演示汉诺塔算法的执行流程

    汉诺塔算法演示

    汉诺塔算法的演示,比较简单

    VC++汉诺塔算法.7z

    在VC++环境中实现汉诺塔算法,我们可以利用C++语言的特性,特别是递归函数,来解决这个问题。这个压缩包文件“VC++汉诺塔算法.7z”可能包含了一个完整的VC++项目,用于演示如何用C++编程实现汉诺塔游戏的解决方案。 ...

    汉诺塔算法分析实验报告

    - **M 根柱子的汉诺塔问题**:当柱子数量M为3时,可以使用经典的汉诺塔算法,即 pow(2,n) - 1 的公式计算最少移动次数。对于M不等于3的情况,使用递归策略,通过计算不同分割点的最少移动次数并找到最小值。 - **...

Global site tag (gtag.js) - Google Analytics