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

/**
 * 汉诺塔大学的时候就学过,但是根本没搞明白,唯一知道的就是要用递归的方法来求解。
 * 问题描述:
 * 有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。
 * 要求按下列规则将所有圆盘移至C杆:
 * 1.每次只能移动一个圆盘;
 * 2.大盘不能叠在小盘上面。
 * 提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,
 * 但都必须尊循上述两条规则。
 * 问:如何移?最少要移动多少次?
 * 解决方法:
 * 假设只有2个盘子,柱子分别是A, B, C柱。那么只需要三步就可以把他们从A柱移到C柱,
 * 这三步是A->B, A->C, B->C。
 * 如果盘子数n超过2呢,我们就可以把这些盘子看成由最下面的那个盘子和 上面n-1个盘子 两部分,
 * 这两部分同样可以用上面的三步实现移动。
 * 也就是说我们可以通过递归地调用上面的步骤实现将所有n个盘子从A柱移动到C柱。
 */
package al;
public class Hanoi { 

  public static void main(String[] args) { 

    Hanoi hanoi = new Hanoi();
    hanoi.move(3, 'A', 'B', 'C');
  } 

  /**
   * @author
   * @param n 盘子数目
   * @param from 起始柱子
   * @param temp 中间柱子
   * @param to 目标柱子
   */
  public void move(int n, char from, char temp, char to) {
    if(n == 1) {
      System.out.println("Move 1 plate from " + from + " to " + to);
    } else {
      move(n-1, from, to, temp);
      move(1, from, temp, to);
      move(n-1, temp, from, to);
    }
  }
} 

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, 算法
, 数据结构
, Hanoi
汉诺塔问题
hanoi、hanoi塔、hanoi塔问题、hanoi tower、tower of hanoi,以便于您获取更多的相关知识。

时间: 2024-09-17 04:46:44

Java数据结构及算法实例:汉诺塔问题 Hanoi_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,当然,

Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)_java

/** * 快速计算二进制数中1的个数(Fast Bit Counting) * 该算法的思想如下: * 每次将该数与该数减一后的数值相与,从而将最右边的一位1消掉 * 直到该数为0 * 中间循环的次数即为其中1的个数 * 例如给定"10100",减一后为"10011",相与为"10000",这样就消掉最右边的1 * Sparse Ones and Dense Ones were first described by Peter Wegner i

Java数据结构及算法实例:选择排序 Selection Sort_java

/** * 选择排序的思想: * 每次从待排序列中找到最小的元素, * 然后将其放到待排的序列的最左边,直到所有元素有序 * * 选择排序改进了冒泡排序,将交换次数从O(N^2)减少到O(N) * 不过比较次数还是O(N) */ package al; public class SelectSort { public static void main(String[] args) { SelectSort selectSort = new SelectSort(); int[] elements

Java数据结构及算法实例:冒泡排序 Bubble Sort_java

/** * 冒泡排序估计是每本算法书籍都会提到的排序方法. * 它的基本思路是对长度为N的序列,用N趟来将其排成有序序列. * 第1趟将最大的元素排在序列尾部,第2趟将第2大的元素排在倒数第二的位置, * 即每次把未排好的最大元素冒泡到序列最后端. * 该排序方法实际上分为两重循环,外层循环:待排元素从数组的第1个元素开始. * 内层循环:待排元素从数组的第1个元素开始,直到数组尾端未排过的元素. * 在内循环中,如果遇到前面元素比其后的元素大就交换这两个元素的位置. * 由此可见冒泡排序的复杂

Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture_java

/** * 考拉兹猜想:Collatz Conjecture * 又称为3n+1猜想.冰雹猜想.角谷猜想.哈塞猜想.乌拉姆猜想或叙拉古猜想, * 是指对于每一个正整数,如果它是奇数,则对它乘3再加1, * 如果它是偶数,则对它除以2,如此循环,最终都能够得到1. */ package al; public class CollatzConjecture { private int i = 1; public static void main(String[] args) { long l = 9

Java数据结构及算法实例:三角数字_java

/** * 三角数字: * 比达哥斯拉领导下的古希腊数学家发现了一个有趣的数字序列1, 3, 6, 10, 15, 21,... * 你能看出他们有什么规律么? * 对了它的规律就是f(x) = x+ f(x-1) * 想想是不是很像小时候打算盘从1一直加到100啊 */ package al; public class Triangle { public static void main(String[] args) { Triangle triangle = new Triangle();

Java数据结构及算法实例:朴素字符匹配 Brute Force_java

/** * 朴素字符串算法通过两层循环来寻找子串, * 好像是一个包含模式的"模板"沿待查文本滑动. * 算法的思想是:从主串S的第pos个字符起与模式串进行比较, * 匹配不成功时,从主串S的第pos+1个字符重新与模式串进行比较. * 如果主串S的长度是n,模式串长度是 m,那么Brute-Force的时间复杂度是o(m*n). * 最坏情况出现在模式串的子串频繁出现在主串S中. * 虽然它的时间复杂度为o(m*n),但在一般情况下匹配时间为o(m+n), * 因此在实际中它被大量

Java数据结构及算法实例:插入排序 Insertion Sort_java

/** * 选择排序的思想: * 每次循环前,数组左边都是部分有序的序列, * 然后选择右边待排元素,将其值保存下来 * 依次和左边已经排好的元素比较 * 如果小于左边的元素,就将左边的元素右移一位 * 直到和最左边的比较完成,或者待排元素不比左边元素小 */ package al; public class InsertionSort { public static void main(String[] args) { InsertionSort insertSort = new Insert

C++实现汉诺塔算法经典实例_C 语言

本文所述为汉诺塔算法的C++代码的经典实现方法. 汉诺塔问题描述:3个柱为a.b.c,圆盘最初在a柱,借助b柱移到c柱.需要你指定圆盘数. 具体实现代码如下: #include <iostream> using namespace std; int times = 0; //全局变量,搬动次数 //第n个圆盘从x柱搬到z柱 void move(int n, char x, char z) { cout << "第" << ++times <&l