Java分治算法经典案例之汉诺塔

2023-10-31

分治算法
思想

当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出。对于这类问题,我们往往先把它分解成几个子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成求整个问题的解法。如果这些子问题还较大,难以解决,可以再把它们分成几个更小的子问题,以此类推,直至可以直接求出解为止。这就是分治策略的基本思想。

分治法解题步骤

(1)分解,将要解决的问题划分成若干规模较小的同类问题;
(2)求解,当子问题划分得足够小时,用较简单的方法解决;
(3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。

分治算法经典——汉诺塔

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

汉诺塔Java实现
package dac;

public class HanoiTower {
    public static void main(String[] args) {
        //分治算法的汉诺塔问题
        hanoiTower(5,'A','B','C');
    }

    /**
     * @param num 一共有多少个盘
     * @param a   a塔
     * @param b   b塔
     * @param c   c塔
     */
    public static void hanoiTower(int num, char a, char b, char c) {
        //如果只有一个盘,从a移动到c
        if (num == 1) {
            System.out.println("第1个盘从 " + a + "——>" + c);
        } else {
            //如果有n>=2个盘,应该看成只有两个盘,将最下面的一个盘和上面的所有盘分开看待。
            //先把最上面的所有盘a——>b,移动过程会使用到c
            hanoiTower(num - 1, a, c, b);
            //把最下面的盘从a——>c
            System.out.println("第" + num + "个盘从 " + a + "——>" + c);
            //把B塔的所有盘从b——>c,移动过程会使用到a塔
            hanoiTower(num-1, b, a, c);
        }
    }
}
运行结果
第1个盘从 A——>C
第2个盘从 A——>B
第1个盘从 C——>B
第3个盘从 A——>C
第1个盘从 B——>A
第2个盘从 B——>C
第1个盘从 A——>C
第4个盘从 A——>B
第1个盘从 C——>B
第2个盘从 C——>A
第1个盘从 B——>A
第3个盘从 C——>B
第1个盘从 A——>C
第2个盘从 A——>B
第1个盘从 C——>B
第5个盘从 A——>C
第1个盘从 B——>A
第2个盘从 B——>C
第1个盘从 A——>C
第3个盘从 B——>A
第1个盘从 C——>B
第2个盘从 C——>A
第1个盘从 B——>A
第4个盘从 B——>C
第1个盘从 A——>C
第2个盘从 A——>B
第1个盘从 C——>B
第3个盘从 A——>C
第1个盘从 B——>A
第2个盘从 B——>C
第1个盘从 A——>C

Process finished with exit code 0

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java分治算法经典案例之汉诺塔 的相关文章

随机推荐

  • VSCode官网无法下载

    因为不是国内的服务器 所以有可能无法下载或者下载失败 将下载地址https stable之间的部分更改为vscode cdn azure cn 重新复制地址下载就可以
  • 语音信号加噪频域分析与滤波处理(MATLAB GUI)

    语音信号加噪频域分析与滤波处理 MATLAB GUI 文章目录 语音信号加噪频域分析与滤波处理 MATLAB GUI GUI功能界面如图所示 部分代码展示 IIR高通滤波结果 IIR带通滤波结果 联系方式 email Jaceshuai j
  • python重复执行_python scrapy重复执行实现代码详解

    这篇文章主要介绍了python scrapy重复执行实现代码详解 文中通过示例代码介绍的非常详细 对大家的学习或者工作具有一定的参考学习价值 需要的朋友可以参考下 Scrapy是一个为了爬取网站数据 提取结构性数据而编写的应用框架 我们只需
  • windows使用rdp远程连接deepin

    deepin版本是截止目前最新的15 11 可以安装xrdp和x11vnc来使用windows可以远程连接 首先开启ssh sudo apt get install openssh server 开启服务 sudo systemctl st
  • 云计算 第七章 云安全(3)概述 云计算面临的安全问题 云安全问题的深层原因 云安全关键技术 云计算信息安全的国内外标准化

    关注公众号凡花花的小窝 收获更多的考研计算机专业编程相关的资料 加密与解密 目前 云服务提供商般采用密码学中的技 术来保证数据安全 常用技术之一就是对数招进1加8和联名密码技术不仅服务于信息的加密和解密 也是身份认证 访问控制和数排签名等多
  • 根据E-R图设计数据库表

    上图是一个E R图 一共有三个实体 司机 车辆 车队 并且这几个实体之间互相具有一定的联系 我们首先把所有实体的表写出来 数据类型的选择请参考文章 https blog csdn net qq 61659383 article detail
  • 最完整梳理:SSL证书的诞生和历史

    HTTPS加密已经成为主流的网络传输协议 但是 SSL证书的诞生和历史你了解吗 跟着本文一起了解一下SSL证书的进化史 SSL TLS协议进化史 SSL协议 Secure Sockets Layer 安全套接层 是一套网络通信安全协议 具有
  • Nginx(二十一)nginx配置python

    一 scgi wsgi uwsgi 1 scgi gt 了解 SCGI是一种 与语言无关 的连接 web服务器 和 web应用程序 的方法 2 wsgi gt 协议 wsgi 一种 实现python解析 的通用 接口标准 协议 实现了 py
  • nginx的简单介绍 什么是nginx,为什么使用nginx,nginx的优点

    一 什么是nginx 1 Nginx是一款轻量级的Web 服务器 反向代理服务器及电子邮件 IMAP POP3 代理服务器 在BSD like 协议下发行 其特点是占有内存少 并发能力强 事实上nginx的并发能力在同类型的网页服务器中表现
  • Java高级面试题解析(二):百度Java面试题前200页(精选)

    基本概念 操作系统中 heap 和 stack 的区别 heap是堆 stack是栈 是两种不同的数据结构 堆是队列优先 先进先出 栈是先进后出 在java多线程中 每个线程都有自己的栈 不同的线程共享一个堆 在java内存中 栈中存放的大
  • 国庆在家写了个简易版的在线简历网站

    一个可在线编辑的简历页面 放在github Page上托管 在线编辑 可生成PDF 从此跑路没烦恼 目录 一 GitHub Page托管简历 二 修改简历 三 简历下载 一 GitHub Page托管 1 页面样式 这个简历单纯页面技术含量
  • tcpclient和tcplistener通信

    服务器和客户端的代码都在在vs中编写并运行的 功能上实现了一个客户端和服务器互发消息 如果哪位大神知道多个客户端怎么搞 请留个思路给我 感谢 服务器的代码 using System using System Collections Gene
  • Git commit格式 详解

    我们在使用git进行版本控制的时候 commit的格式是有要求的 我们可以先去看一些顶级项目他们的commit的格式是怎样的 angular在github上的commit信息 我们可以发现 commit都有一些前缀 比如说 feat tes
  • VRTK简要说明

    1 导入VRTK开发包 下方三个为基础控件 用于识别硬件设备以及相关配置 2 移动功能简介 3 ui交互事件 将VRTK UICanvas 组件添加到Canvas下可用ui所有事件 1 问题容易出现ui穿透 所以在做的时候要防止穿透 最好不
  • sqli-labs通关大全(更新至Less60)

    sqli labs通关 less1 less10 箭雨镜屋 CSDN博客 sqli labs通关 less11 less20 箭雨镜屋 CSDN博客 sqli labs通关 less21 less30 箭雨镜屋 CSDN博客 sqli la
  • config:fail,Error: 系统错误,错误码:63002,invalid signature

    经过半天的尝试 终于把这个解决了 本文章比较是和 前端用 hash分享下这个问题吧 看了好多文章都没解决了我的问题 直接上干货 1 首先出一张基本的问题图 2 针对上面这个图第2点内 hash 做个讲解 因为我前端用的 hash模式 一般网
  • 编码之Base64编码

    Base64编码 是一种基于 64 个可打印字符来表示二进制数据的方法 目前 Base64 已经成为网络上常见的传输 8 位二进制字节代码的编码方式之一 为什么会有 Base64 编码呢 因为有些网络传送渠道并不支持所有的字节 例如 传统的
  • 【Xilinx AX7103 MicroBalze学习笔记2】MicroBlaze 串口发送 Hello World 实验

    目录 实验介绍 硬件设计 Vivado部分 创建工程 搭建Block Design MicroBlaze部分 外围模块部分 时钟模块 Uart部分 管脚绑定 时钟约束 生成Bit流文件 软件设计 SDK部分 板级验证 总结 往期系列博客 实
  • stm32无人机-飞行力学原理

    惯性导航 是一种无源导航 不需要向外部辐射或接收信号源 就能自主进行确定自己在什么地方的一种导航方法 惯性导航主要由惯性器件计算实现 惯性器件包括陀螺仪和加速度计 一般来说 惯性器件与导航物体固连 加速度计测量物体运动的加速度 已知初始状态
  • Java分治算法经典案例之汉诺塔

    分治算法 思想 当我们求解某些问题时 由于这些问题要处理的数据相当多 或求解过程相当复杂 使得直接求解法在时间上相当长 或者根本无法直接求出 对于这类问题 我们往往先把它分解成几个子问题 找到求出这几个子问题的解法后 再找到合适的方法 把它