汉诺塔

有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,
要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小
盘子上方。

--如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3878076.html "谢谢--

问题:
1.如何移动;
2.n个盘子移动多少次(count)?

解决问题1:
为了将第n个盘子从A移动到C,就得先将第n个盘子上面的第n-1盘子移动到B上;
同样的,要想将B上的第n-1个盘子移动到C上,就得先将第n-2个盘子移动到A上。

解决问题2:
当n = 1 时,count = 1;
当n = 2 时,count = 3;
当n = 3 时,count = 7;
当n = 4 时,count = 15;
…………
根据以上可得表达式:
count(1) = 1
count(n) = 2*count(n)+1 (n>1)
即n个盘子移动的次数表达式为:
count(n) = 2^n - 1 (n>0)

用代码实现为:
package com.xhj.data;

import java.util.Scanner;

/**
* 递归算法实现汉诺塔
*
* @author XIEHEJUN
*
*/
public class HanoiTower {

/**
* 定义移动次数
*/
private static int count;

/**
* 设置移动次数的起始值
* @param count
*/
public static void setCount() {
  HanoiTower.count = 1;
}

/**
* 获取移动次数
*
* @return
*/
public static int getCount() {
  return count-1;
}

/**
* 移动递归
*
* @param num
* 盘子数
* @param from
* 柱子A
* @param inner
* 柱子B
* @param to
* 柱子C
*/
public static void moveDish(int num, char from, char inner, char to) {

  if (num == 1) {
    System.out.println("\t\t**\t"+count++ + " " + num + "号盘子从" + from + "移动到" + to);
  } else {
    moveDish(num - 1, from, inner, to);
    System.out.println("\t\t**\t"+count++ + " " + num + "号盘子从" + from + "移动到" + to);
    moveDish(num - 1, inner, from, to);
  }
}

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);
try {
  for (;;) {
    System.out.print("请输入盘子的个数:");
    int n = sc.nextInt();
    System.out.println("\t\t**********************************");
    System.out.println("\t\t**\t移动步骤为:");
    setCount();
    moveDish(n, 'A', 'B', 'C');
    System.out.println("\t\t**\t一共移动的步数为:" + getCount());
    System.out.println("\t\t**********************************");
  }
} catch (Exception e) {
  System.out.println("输入数据不正确,请输入整数");
  main(null);
 }

}

}

java笔记--代码实现汉诺塔移动过程和移动次数的更多相关文章

  1. python运用turtle 画出汉诺塔搬运过程

    python运用turtle 画出汉诺塔搬运过程 1.打开 IDLE 点击File-New File 新建立一个py文件 2.向py文件中输入如下代码 import turtle class Stac ...

  2. java利用递归实现汉诺塔算法

    package 汉诺塔; //引入Scanner包,用于用户输入 import java.util.Scanner; public class 汉诺塔算法 { public static void m ...

  3. 汉诺塔VII(递推,模拟)

    汉诺塔VII Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  4. HDUOJ---1996汉诺塔VI

    汉诺塔VI Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  5. 【C语言】汉诺塔问题

    之前遇见这个问题,非常费劲地理解了,并写出代码,然后过段时间,再遇见这个问题,又卡住了,如此反反复复两三次,才发现自己对递归的理解依然很肤浅.今天无聊,重温<算法:c语言实现>一书,又遇见 ...

  6. [algorithm] 汉诺塔问题

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

  7. #C++初学记录(初识汉诺塔)

    汉诺塔 题目 用1,2,...,n表示n个盘子,称为1号盘,2号盘,....号数大盘子就大.经典的汉诺塔问 题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于 印度传说的 ...

  8. 递归--练习2--noi6261汉诺塔

    递归--练习2--noi6261汉诺塔 一.心得 先把递推公式写出来,会很简单的 二.题目 6261:汉诺塔问题 总时间限制:  1000ms 内存限制:  65536kB 描述 约19世纪末,在欧州 ...

  9. ACM_汉诺塔问题(递推dp)

    Problem Description: 最近小G迷上了汉诺塔,他发现n个盘子的汉诺塔问题的最少移动次数是2^n-1,即在移动过程中会产生2^n个系列.由于发生错移产生的系列就增加了,这种错误是放错了 ...

随机推荐

  1. (转)drbd详解

    原文:http://blog.csdn.net/u014421556/article/details/52925442

  2. php在单个文件内开启dbug

    1.在文件开头添加如下代码 ini_set('display_errors', true); error_reporting(E_ALL);

  3. eclips中maven解决jsp报错的问题

    加入如下的pom依赖: <!-- 解决jsp报错的依赖包第一个 --> <dependency> <groupId>javax.servlet</groupI ...

  4. 深度学习(十六) ReLU为什么比Sigmoid效果好

    sigmoid: Relu: 为什么通常Relu比sigmoid和tanh强,有什么不同?主要是因为它们gradient特性不同. 1.sigmoid和tanh的gradient在饱和区域非常平缓,接 ...

  5. Java GC 垃圾回收算法 内存分配

    垃圾回收(Garbage Collection, GC)是Java不同于c与c++的重要特性之一. 他帮助Java自动清空堆中不再使用的对象. 由于不需要手动释放内存,程序员在编程中也可以减少犯错的机 ...

  6. window.location.href详解

    在写web程序的时候,我们经常遇到跳转页面的问题,我们经常使用Response.Redirect做页面跳转,如果客户要在跳转的时候使用提示,这个就不灵光了,如: Response.Write(&quo ...

  7. spring之IOC模拟实现

    使用Spring框架已经有很长时间了,一直没有仔细的想过框架的设计思想是什么样的,底层到底是怎么实现的,这几天调试程序看了些源码,写下来做个记录.由于Spring框架博大精深,个人理解的难免有不正确的 ...

  8. R语言数据重塑cbind+rbind+merge+ melt+cast

    R语言中的数据重塑是关于变化的数据分为行和列的方式.大多数R地数据处理的时候是通过将输入的数据作为一个数据帧进行.这是很容易提取一个数据帧的行和列数据,但在某些情况,当我们需要的数据帧的格式是不同的来 ...

  9. R语言查找变量ls函数

    要知道目前在工作区中的可用变量,可以使用 ls()函数列出所有变量. 另外,ls() 函数可以使用模式来匹配变量名称. print(ls()) 当上面的代码执行时,它产生以下结果: [1] " ...

  10. 利用jquery判断点是否在椭圆内

    源码例子下载 : <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" ...