java笔记--代码实现汉诺塔移动过程和移动次数
汉诺塔
有三根相邻的柱子,标号为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笔记--代码实现汉诺塔移动过程和移动次数的更多相关文章
- python运用turtle 画出汉诺塔搬运过程
python运用turtle 画出汉诺塔搬运过程 1.打开 IDLE 点击File-New File 新建立一个py文件 2.向py文件中输入如下代码 import turtle class Stac ...
- java利用递归实现汉诺塔算法
package 汉诺塔; //引入Scanner包,用于用户输入 import java.util.Scanner; public class 汉诺塔算法 { public static void m ...
- 汉诺塔VII(递推,模拟)
汉诺塔VII Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- HDUOJ---1996汉诺塔VI
汉诺塔VI Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- 【C语言】汉诺塔问题
之前遇见这个问题,非常费劲地理解了,并写出代码,然后过段时间,再遇见这个问题,又卡住了,如此反反复复两三次,才发现自己对递归的理解依然很肤浅.今天无聊,重温<算法:c语言实现>一书,又遇见 ...
- [algorithm] 汉诺塔问题
汉诺塔是根据一个传说形成的一个问题.汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗 ...
- #C++初学记录(初识汉诺塔)
汉诺塔 题目 用1,2,...,n表示n个盘子,称为1号盘,2号盘,....号数大盘子就大.经典的汉诺塔问 题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于 印度传说的 ...
- 递归--练习2--noi6261汉诺塔
递归--练习2--noi6261汉诺塔 一.心得 先把递推公式写出来,会很简单的 二.题目 6261:汉诺塔问题 总时间限制: 1000ms 内存限制: 65536kB 描述 约19世纪末,在欧州 ...
- ACM_汉诺塔问题(递推dp)
Problem Description: 最近小G迷上了汉诺塔,他发现n个盘子的汉诺塔问题的最少移动次数是2^n-1,即在移动过程中会产生2^n个系列.由于发生错移产生的系列就增加了,这种错误是放错了 ...
随机推荐
- Java 8学习之Lambda表达式
一.lambda表达式 一个lambda表达式包含三个部分: 一段代码 参数 自由变量的值,这里的自由指的是哪些不是参数并且没有在代码中定义的变量. 示例: public static void re ...
- Guava源码解析之EventBus
最近看Elastic-Job源码,看到它里面实现的任务运行轨迹的持久化,使用的是Guava的AsyncEventBus,一个内存级别的异步事件总线服务,实现了简单的生产-消费者模式,从而在不影响任务执 ...
- 2 小时学会 Spring Boot
一. 什么是 Spring Boot Takes an opinionated view of building production-ready Spring applications. Sprin ...
- 字符编码的来源,ascii、unicode和utf-8编码的关系
字符编码 我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特 ...
- js解决千分符问题
js脚本function: //js数字千分符处理 function commafy(num) { num = num + ""; var re = /(-?\d+)(\d{3}) ...
- box-shadow向元素添加阴影效果
div{ box-shadow: 10px 10px 5px #888888;} 语法:box-shadow: h-shadow v-shadow blur spread color inset; 值 ...
- 使用jdk生成ssl证书文件
java自带有 ssl 证书生成的工具, 在 /bin/keytools.exe 需要确认已经正确配置JAVA_HOME的环境变量 生成服务端证书: keytool -genkey -v -alias ...
- C#判断字符串中是否包含一个子字符串是可以直接使用Contains()方法
1. 以前判断一个字符串中是否包含另一个子字符串时,习惯使用 IndexOf(); string str = "ABC@QQ"; if(str.IndexOf("@&qu ...
- win7下安装centos6.5后,开机无法进入选择双系统启动界面,只能启动centos的解决办法
1.centos6.5下打开终端,进入/boot/grub ,vim grub.conf 将default=0 改为1,重启 2.重启后,又只能进入win7了.这个好解决.下载一个easyBCD,具体 ...
- Mathematik
Ausdruck auf Deutsch Lösen Problem der Abteilung. 求导. Die Abteilung von 3x ist 3. 3x的导数是3 Lösen Prob ...