Java SE求解汉诺塔问题的示例代码
作者:K媾? 发布时间:2022-05-10 23:44:30
标签:Java,汉诺塔
1.问题描述
汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。
大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。
大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。
并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。 问应该如何操作?
2.画图分析
一个圆盘的情况:移动前
移动后
1个盘子:A直接移动到C
二个圆盘的情况:移动前
移动后
2个圆盘:A->B A->C B->C
三个圆盘的情况:移动前
移动后
三个圆盘:A->C A->B C->B A->C B->A B->C A-C
3.问题讲解
当有3个盘子的时候,你就会发现一个问题,你肯定是要先将上面的两个盘子移动到B柱,再把最底下的一个盘子移动到C柱,最后再把B柱的盘子移动到C柱。4个盘子的话也是一样,要先将上面的3个盘子移动到B柱,在把最底下的一个盘子移动到C柱,最后再把B柱的盘子移动到C柱。这样我们就有了一个思路,不管多少个盘子,都要先将n - 1个盘子移动到B柱,最底下的一个盘子移动到C柱,最后再把B柱的盘子移动到C柱。
我们先来看一下规律:
1个盘子:A->C 1次
2个盘子:A->B A->C B->C 3次
3个盘子:A->C A->B C->B A->C B->A B->C A-C 7次
这样你就能看出移动的次数其实就是2^n - 1(n是盘子的数量)
4.代码实现
ublic class TestDemo {
//首先要写个模拟鼠标移动过程的函数,我们要打印出移动的全部过程
//这个move函数做到的就是从1位置移动到2位置,有可能是A->B,A->C,C-B......等各种可能
public static void move(char pos1,char pos2){//所以说这里只需要传对应的位置就可以了
System.out.print(pos1+"->"+pos2+" ");//pos1移动到pos2
}
/**
*
* @param n n代表你盘子的个数
* @param pos1 盘子所在的位置
* @param pos2 盘子的中转位置
* @param pos3 盘子的结束位置
*/
public static void hanio(int n,char pos1,char pos2,char pos3){
if(n == 1){
move(pos1,pos3);//如果只有一个盘子那就从A柱挪到C柱上
}else{
hanio(n-1,pos1,pos3,pos2);//这里是把n-1个盘子从A柱借助C柱移动到B柱
move(pos1,pos3);//底下剩下的最后一个盘子从A柱移动到C柱
hanio(n-1,pos2,pos1,pos3);//这里是把n-1个盘子从B柱借助A柱移动到C柱
}
}
public static void main(String[] args) {
hanio(1,'A','B','C');//一开始我们的汉诺塔要规定一下,我们第一次给它传过去的位置
System.out.println();
hanio(2,'A','B','C');
System.out.println();
hanio(3,'A','B','C');
System.out.println();
}
}
打印结果:
来源:https://blog.csdn.net/m0_64397675/article/details/123205881


猜你喜欢
- 详解Http请求中Content-Type讲解以及在Spring MVC中的应用引言: 在Http请求中,我们每天都在使用Content-t
- 入队(EnQueue) 、出队(TryDequeue) 、是否为空(IsEmpty)、获取队列内元素数量(Count)。一、Concurre
- java Long类型转为String类型1、Long.ValueOf("String")返回Long包装类型数据包装类
- DrawerLayout顾名思义就是一个管理布局的。使用方式可以与其它的布局类类似。DrawerLayout带有滑动的功能。只要按照draw
- Android 使用mediaplayer播放res/raw文件夹中的音乐的实例(1)在res文件夹中新建一个文件夹重命名为raw,并且将要
- trim标记是一个格式化的标记,可以完成set或者是where标记的功能,如下代码:1、select * from user <tri
- /** * 快速计算二进制数中1的个数(Fast Bit Counting) * 该算法的思想如下: * 每次将该数与该数减一后的数值
- <?xml version="1.0" encoding="UTF-8" ?> <
- 获取map的key和value的方法分为两种形式:map.keySet():先获取map的key,然后根据key获取对应的value;map
- 基本要点1、定义根据百度百科的定义,RESTFUL是一种网络应用程序的设计风格和开发方式2、传统方式与Restful风格的区别在我们学习re
- 需求使用 spring-boot 项目开发中,项目启动时“非常”慢的。如果每次修改代码或静态资源文件后都需要重新启动项目,这是多么痛苦的事。
- 一、概念从本质上来说,它就是一个匿名函数,可以用来直接实现接口中的方法,从而简化代码。但是Lambda有一个限制,不能实现接口中的所有方法,
- 传统“长轮询”实现Web端即时通讯的问题WebSocket出现之前,Web端为了实现即时通讯,所用的技术都是Ajax轮询(polling)。
- checked 和 unchecked关键字用来限定检查或者不检查数学运算溢出的;如果使用了checked发生数学运算溢出时会抛出Overf
- java jdbc连接和使用jdbc导入驱动//jar是已经打包好的class文件集,可以引用到其他工程中 //Build Pa
- 目录C# Hello World 实例编译 & 执行 C# 程序在我们学习 C# 编程语言的基础构件块之前,让我们先看一下 C# 的
- 简介MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改
- java 获取字节码文件的几种方法总结在本文中,以Person类为例,将分别演示获取该类字节码文件的三种方式,其具体思想及代码如下所示:pu
- 该说不唠,直接上代码。可直接复制使用package com.yuezhi.util;import java.math.BigDecimal;
- 死信队列:没有被及时消费的消息存放的队列,消息没有被及时消费有以下几点原因:1.有消息被拒绝(basic.reject/ basic.nac