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个系列.由于发生错移产生的系列就增加了,这种错误是放错了 ...
 
随机推荐
- 【MPI】执行mpiexec出错
			
运行mpiexec提示mpiexec_mic: cannot connect to local mpd (/tmp/mpd2.console_jzhang); possible causes: 1. ...
 - Asp.Net Cache缓存技术学习
			
本文参考自Fish Li的细说 ASP.NET Cache 及其高级用法 一.前言,相信大多数做网站开发的都知道缓存技术对于网站的重要性,它对于网站的性能优化起着至关重要的作用. 关于缓存的技术大致有 ...
 - 释放linux端口
			
感谢作者的共享,在此表示感谢 有时候关闭软件后,后台进程死掉,导致端口被占用.下面以TOMCAT端口8060被占用为例,列出详细解决过程. 解决方法: 1.查找被占用的端口 netstat -tln ...
 - mysql  exceeded the 'max_questions' resource 记录
			
最近Hive Meta的 Mysql 常报错 'user' has exceeded the 'max_questions' resource (current value: 10000) 解决:调 ...
 - ubuntu 16.04安装好后没声音的解决方法
			
刚安装好Ubuntu16.04 后没声音,找了好多方法都不行,看到网上说通过安装pavucontrol和alsamixer调节解决,最后无意发现一个方法,总算是可以用了,在此记录一下.可能有的可以解决 ...
 - redis实战笔记(1)-第1章 初识Redis
			
第1章 初识Redis 注:本书在redis3.0版本的,比如redis3.0以后支持服务端集群.3.0之前只能客户端分片. 本章主要内容 1.Redis与其他软件的相同之处和不同之处 2.Re ...
 - 阿里云 ECS服务器安装流程
			
1. 挂载硬盘 2. 上传文件 3 .vncserver unset DISPLAY who -u export DISPLAY= xhost + 4. java /etc/profile expor ...
 - Android studio--几个生成文件的区别:Make Project、Make Module、Build apk、Signed apk
			
参考资料: https://stackoverflow.com/questions/35334319/difference-between-make-project-make-module-app-b ...
 - WCF 创建WCF
			
一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NE ...
 - UbuntuServer 16.04 with LNMP搭建WordPress
			
前几天弄了个腾讯云服务器,一时新鲜,就想着在上面搭建一个wordpress博客,前后搞了四五天,各种度娘谷歌,各种错误,不过还好,最终总算是被我搭建出来了!不啰嗦,书归正传,下面开始搭建! 目录: 一 ...