Java 实现一个汉诺塔实战练习
作者:Dark And Grey 发布时间:2021-12-20 14:49:47
标签:Java,汉诺塔,实战
汉诺塔简介:
我们想要实现的是 让 A柱上的盘子,移动到C柱上
1层汉诺塔
2层汉诺塔
3层汉诺塔详解图
第一步
第二步
第三步
第四步
第五步
第六步
第七步
经过上面的图解,相比大家一定在一定程度了解到汉诺塔的游戏规则,以及怎么去玩。
总之 最终C柱上第一个盘子,是最大,最顶的是最小的,而且在操作过程中,前几步就是为了让三个柱子中最大的盘子移动到C柱上,
然后不断,将它两个柱子中最大盘子往上累加,(盘子从大到小,从下往上摆放)
而且盘子一多,你就会发现过程中间,除了最大的盘子,其余的盘子都会集中在 B柱上,这样才能把 A 柱上最底下也是最大的盘子,移动到C上。
这是规律一
还有一个规律,在最大的盘子移动C柱上之后,第二个大的盘子要放在A柱上,其余盘子按照规则全部放在B柱上,
这样第二大的盘子才能移动到最大的盘子上
说白了,盘子再多,也要按照上面两个规律,才能完成整个游戏
那我把最大盘子上面的所有盘子看成一个整体,放在B柱上,最大盘子移动到C柱上,把B柱上盘子直接盖上去,不就行了,反正也就是重复那两个规律而已
程序如下
import java.util.Scanner;
public class Manuscript {
static int times;// 移动次数
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
char A = 'A';
char B = 'B';
char C = 'C';
int n = scanner.nextInt();
game(n,A,B,C);
scanner.close();
}
public static void move(int disk,char M,char N){
System.out.println("第"+(++times)+"次移动,盘子"+disk+" "+M +"---->"+N);
}
public static void game(int n,char A,char B,char C){
if(n==1){
move(n,A,C);// 把A柱目前最大盘子放在C柱上,第一次肯定最大的那个
}else{
// 将 n-1 个 盘子 放到B柱子,注意ABC位置,再看看下面 move(n,A,C);,细细琢磨
game(n-1,A,C,B);// A B(C) C(B)
move(n,A,C);
// 把n-1 个盘子 放在C上,注意ACB位置
game(n-1,B,A,C);// A(B) B(A) C
}
}
}
3层汉诺塔的输出结果附图(可以返回去看看,对一对)
有什么疑问,可以在下方讨论,切记 不要自己带入一个特别大数字去展开,带入一个 1 ~3 ,了解规律就行。不主张展开,主张掌握规律(递推公式)。
本文结束。
来源:https://blog.csdn.net/DarkAndGrey/article/details/120924413


猜你喜欢
- 前言:在纯 Java 代码里 我们一般都会用class.getResource(String name) 或者 class.getClass
- 本文实例为大家分享了Java swing读取txt文件实现学生考试系统的具体代码,供大家参考,具体内容如下主要实现了一个简单的倒计时答题系统
- 在C#语言中,DateTime是用来表示时间的类,在C#的DateTime时间类中,提供了好像时间对象加减法操作,可用于某一个时间对象加减
- 一、导入相关jar包,pom依赖如下: <dependency> <groupId>org
- 在文本框中输入一个数字,点击开始累加按钮,程序计算从1开始累计到该数字的结果。因为该累加过程比较耗时,如果直接在UI线程中进行,那么当前窗口
- 本文实例讲述了Android图片处理的方法。分享给大家供大家参考,具体如下:package cn.szbw.util;import Andr
- 本文实例讲述了C#画笔Pen绘制光滑模式曲线的方法。分享给大家供大家参考。具体实现方法如下:using System;using Syste
- 程序触发鼠标、键盘事件是C#程序设计中比较常见的功能,本文实例展示了C#中winform实现自动触发鼠标、键盘事件的方法,有不错的实用价值。
- 在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口、ArrayBlockingQueue、DelayQue
- 前言这几天在做一个小工具app,结果在fragment里面动态申请权限提示原有的申请方法已经弃用,还画了很明显的删除线。。。这叫一个强迫症的
- 环境操作系统windows10JDKjdk1.8.0_192IDEEclipse IDE for Enterprise Java Devel
- 帧率(Frame rate)是用于测量显示帧数的量度。所谓的测量单位为每秒显示帧数(Frames per Second,简称:FPS)或“赫
- 1. 单个属性yaml 内的属性如下:server: port: 80只需在成员变量上注解 @Value(“
- 在实现蓝牙接收时,网上的资料很多,使用起来也很简单,但是我觉得还是有必要把这些知识总结下来。蓝牙开发需要用到一个第三方的库InTheHand
- 一、引入maven依赖Spring Boot默认使用LogBack,但是我们没有看到显示依赖的jar包,其实是因为所在的jar包spring
- 一、什么是外观模式定义:为子系统中的一组接口提供一个一致的界面,用来访问子系统中的一群接口。外观模式组成:Facade:负责子系统的的封装调
- 第一部分代码(实体类)package com.wf.entity;public class Hehe{private int hehe_id
- 首先在命令行创建一个PhoneGap工程phonegap create . "jspdf.sample" "J
- 本文实例讲述了Java对XML文件增删改查操作。分享给大家供大家参考,具体如下:xml文件:<?xml version="1
- 前言平时在搬砖的时候,大家有没有遇到过这样的一个场景,由于各种不可描述因素导致,一个接口返回的数据 里面的 key 是 A , 但是客户端(