java源码-java实现汉诺塔 求源码解析思路,不要链接

问题描述

java实现汉诺塔 求源码解析思路,不要链接

一共十六个盘子,盘子必须从小到大排列,只能在abc三个塔自由移动,一次只能移动一个!求源码

解决方案

这个要递推,假设开始的时候全部在a塔上,目标是全部移到c塔上。
从一个盘子开始:
1. 一个盘子,从a移到c塔显然只需要一步,所以答案是1
2.两个盘子,那么我们需要先将上面的一个盘子移到b塔,需要1步;再将a最下面的移到c塔上,需要1步;然后再将b塔的移到c塔上,需要1步;所以总计是3
3.三个盘子,那么我们需要先将上面两个移到b塔,按照2中给出的方法来,移动两个需要的步数是3;再将最下面的移到c塔,需要1步;再将b塔的两个移到c塔,需要3步;所以总计7步。
4.四个盘子,那么我们需要先将上面三个移到b塔,按照3中给出的方法来,移动两个需要的步数是7;再将最下面的移到c塔,需要1步;再将b塔的三个移到c塔,需要7步;所以需要15
。。。
所以我们可以推出一个公式:
a(n) = a(n-1)*2 + 1
其中 a(1) = 1

解决方案二:

源码:

 public class Test {
    public static void main(String []args) {

        int a[] = new int[20];
        a[1] = 1;
        for(int i=2;i<19;i++) {

            a[i] = a[i-1]*2 + 1;

        }

        System.out.println("16个盘子:"+a[16]);
    }

}

解决方案三:

汉诺塔用递归实现 源码就几句吧

解决方案四:

《算法之美》里面有汉诺塔问题的,建议你买本书看

解决方案五:

public class Hanoi {
5 public static void main(String args[]) throws Exception {
6 int n;
7 BufferedReader buf =
8 new BufferedReader(new InputStreamReader(System.in));
9 System.out.print("请输入盘数:");
10 n = Integer.parseInt(buf.readLine());
11 Hanoi hanoi = new Hanoi();
12 hanoi.move(n, 'A', 'B', 'C');
13 }
14
15 public void move(int n, char a, char b, char c) {
16 if (n == 1)
17 System.out.println("盘 " + n + " 由 " + a + " 移至 " + c);
18 else {
19 move(n - 1, a, c, b);
20 System.out.println("盘 " + n + " 由 " + a + " 移至 " + c);
21 move(n - 1, b, a, c);
22 }
23 }
24 }

时间: 2024-08-27 02:02:12

java源码-java实现汉诺塔 求源码解析思路,不要链接的相关文章

Java使用递归法解决汉诺塔问题的代码示例_java

汉诺(Hanoi)塔问题:古代有一个梵塔,塔内有三个座A.B.C,A座上有n个盘子,盘子大小不等,大的在下,小的在上(如图). 有一个和尚想把这n个盘子从A座移到B座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上.在移动过程中可以利用B座,要求打印移动的步骤.如果只有一个盘子,则不需要利用B座,直接将盘子从A移动到C. 如果有2个盘子,可以先将盘子1上的盘子2移动到B:将盘子1移动到c:将盘子2移动到c.这说明了:可以借助B将2个盘子从A移动到C,当然,

c#汉诺塔的递归算法与解析_C#教程

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

Java数据结构及算法实例:汉诺塔问题 Hanoi_java

/** * 汉诺塔大学的时候就学过,但是根本没搞明白,唯一知道的就是要用递归的方法来求解. * 问题描述: * 有三根杆子A,B,C.A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小. * 要求按下列规则将所有圆盘移至C杆: * 1.每次只能移动一个圆盘: * 2.大盘不能叠在小盘上面. * 提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆, * 但都必须尊循上述两条规则. * 问:如何移?最少要移动多少次? * 解决方法: * 假设只有2个盘子,柱子分别是A, B, C柱

java 汉诺塔Hanoi递归、非递归(仿系统递归)和非递归规律 实现代码_java

程序如下: 复制代码 代码如下: View Code  /*  * Hanoi塔游戏 问题描述:  * 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.  * 大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照  * 大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小  * 顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在  * 三根柱子之间一次只能移动一个圆盘.  *   * fuction:实现 hanoi塔  *       

java求解汉诺塔问题示例_java

思路如下: 要实现3阶汉诺塔的求解步骤,也就是说初始状态时,A上从上到下有三个盘子,分别为1号盘.2号盘和3号盘,其中1号盘最小,3号盘最大:判断剩余盘子个数,如果只有一个盘子就退出迭代,如果有大于一个盘子就继续迭代.代码如下: 复制代码 代码如下: public class HanoiTower {    public static void moveDish(int level, char from, char inter, char to) {        if (level == 1)

C语言递归实现汉诺塔算法

汉诺塔的递归实现算法,将A中的圆盘借助B圆盘完全移动到C圆盘上, 每次只能移动一个圆盘,并且每次移动时大盘不能放在小盘上面 递归函数的伪算法为如下: if(n == 1) 直接将A柱子上的圆盘从A移动到C else 先将A柱子上的n-1个圆盘借助C柱子移动到B柱子上 直接将A柱子上的第n个圆盘移动到C柱子上 最后将B柱子上的n-1个圆盘借助A柱子移动到C柱子上 该递归算法的时间复杂度为O(2的n次方),当有n个圆盘时,需要移动圆盘2的n次方-1次 操作系统:ubuntu 编译软件:gcc 结果截

汉诺塔的C语言实现以及冒泡排序

汉诺塔绝对是一个经典的算法题目,虽然当年也讲过,程序也不长,但是一直以来总觉得理解的不清楚,看程序也能明白什么意思,过一段时间程序忘了,想不起来的时候,就怎么都想不明白了,虽然说好像是那么回事,就是高不明白.借着前两天做八皇后的东风,顺便来理一下这个汉诺塔.园盘从上到下编号1, 2, --, n,杆子从左至右A,B,C,A是from,C是to.我还是看了以前的java程序然后自己理解一下写的C程序,几乎没有差别,当然写的时候也忘了不少,第一遍出来错误的答案.程序如下: #include <std

【Python学习】Python解决汉诺塔问题

参考文章:http://www.cnblogs.com/dmego/p/5965835.html 一句话:学程序不是目的,理解就好:写代码也不是必然,省事最好:拿也好,查也好,解决问题就好! 信息时代不用信息就是罪过,直接抄不加理解与应用,就不是自己的,下次遇到还是不会,或许其中的某一个细节就能够用于各个问题的解决,共勉 学习一个东西总会遇到一些经典的问题,学习Python第二天尝试看一下汉诺塔问题,还是百度,看看解题思路,纯粹是重温初中课堂,越活越回去了  汉诺塔的图解递归算法 一.起源: 汉

用栈来求解汉诺塔变形问题

package stackAndQueue; import java.util.Stack; /** * 用栈来求解汉诺塔问题:HanoiStack[3] * * [问题描述]:将汉诺塔游戏(小压大)规则修改,不能从左(右)侧的塔直接移到右(左)侧,而是必须经过中间塔. * * 求当塔有N层时,打印最优移动过程和最优移动步数.如N=2,记上层塔为1,下层为2.则打印:1:left->mid;1 * * 由于必须经过中间,实际动作只有4个:左L->中M,中->左,中->右R,右-&g