news 2026/4/28 4:49:24

【困难】用栈来求解汉诺塔问题-Java:解法一

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【困难】用栈来求解汉诺塔问题-Java:解法一

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程大家好!欢迎来到我的网站! 人工智能被认为是一种拯救世界、终结世界的技术。毋庸置疑,人工智能时代就要来临了,科… 继续阅读 前言https://www.captainai.net/troubleshooter

package live.every.day.ProgrammingDesign.CodingInterviewGuide.StackAndQueue; /** * 用栈来求解汉诺塔问题 * * 【题目】 * 汉诺塔问题比较经典,这里修改一下游戏规则:限制不能从最左侧的塔直接移动到最右侧,也不能从最右侧直接移动到最左侧,而是必 * 须经过中间。求当塔有N层的时候,打印最优移动过程和最优移动总步数。 * * 【要求】 * 用以下两种方法解决。 * 方法一:递归的方法; * 方法二:非递归的方法,用栈来模拟汉诺塔的三个塔。 * * 【难度】 * 困难 * * 【解答】 * 方法一:递归的方法。 * * 首先,如果只剩最上层的塔需要移动,则有如下处理: * 1、如果希望从"左"移到"中",打印"Move 1 from left to mid"。 * 2、如果希望从"中"移到"左",打印"Move 1 from mid to left"。 * 3、如果希望从"中"移到"右",打印"Move 1 from mid to right"。 * 4、如果希望从"右"移到"中",打印"Move 1 from right to mid"。 * 5、如果希望从"左"移到"右",打印"Move 1 from left to mid"和"Move 1 from mid to right"。 * 6、如果希望从"右"移到"左",打印"Move 1 from right to mid"和"Move 1 from mid to left"。 * 以上过程就是递归的终止条件,也就是只剩上层塔时的打印过程。 * * 接下来,我们分析剩下多层塔的情况。 * 如果剩下N层塔,从最上到最下依次为1~N,则有如下判断: * 1、如果剩下的N层塔都在"左",希望全部移到"中",则有三个步骤。 * 1)将1~N-1层塔先全部从"左"移到"右",明显交给递归过程。 * 2)将第N层塔从"左"移到"中"。 * 3)再将1~N-1层塔全部从"右"移到"中",明显交给递归过程。 * 2、如果把剩下的N层塔从"中"移到"左",从"中"移到"右",从"右"移到"中",过程与情况1同理,一样是分解为三步,在此不再详 * 述。 * 3、如果剩下的N层塔都在"左",希望全部移到"右",则有五个步骤。 * 1)将1~N-1层塔先全部从"左"移到"右",明显交给递归过程。 * 2)将第N层塔从"左"移到"中"。 * 3)将1~N-1层塔全部从"右"移到"左",明显交给递归过程。 * 4)将第N层塔从"中"移到"右"。 * 5)最后将1~N-1层塔全部从"左"移到"右",明显交给递归过程。 * 4、如果剩下的N层塔都在"右",希望全部移到"左",过程与情况3同理,一样是分解为五步,在此不再详述。 * * 以上递归过程经过逻辑化简之后的代码请参看如下代码中的hanoi1方法。 * * @author Created by LiveEveryDay */ public class HanoiByStack1 { public static int hanoi1(int num, String left, String mid, String right) { if (num < 1) { return 0; } return process(num, left, mid, right, left, right); } private static int process(int num, String left, String mid, String right, String from, String to) { if (num == 1) { if (from.equals(mid) || to.equals(mid)) { System.out.printf("Move 1 from %s to %s%n", from, to); return 1; } else { System.out.printf("Move 1 from %s to %s%n", from, mid); System.out.printf("Move 1 from %s to %s%n", mid, to); return 2; } } if (from.equals(mid) || to.equals(mid)) { String another = (from.equals(left) || to.equals(left)) ? right : left; int part1 = process(num - 1, left, mid, right, from, another); int part2 = 1; System.out.printf("Move %d from %s to %s%n", num, from, to); int part3 = process(num - 1, left, mid, right, another, to); return part1 + part2 + part3; } else { int part1 = process(num - 1, left, mid, right, from, to); int part2 = 1; System.out.printf("Move %d from %s to %s%n", num, from, mid); int part3 = process(num - 1, left, mid, right, to, from); int part4 = 1; System.out.printf("Move %d from %s to %s%n", num, mid, to); int part5 = process(num - 1, left, mid, right, from, to); return part1 + part2 + part3 + part4 + part5; } } public static void main(String[] args) { int r = hanoi1(2, "left", "mid", "right"); System.out.printf("It will move %d steps.", r); } } // ------ Output ------ /* Move 1 from left to mid Move 1 from mid to right Move 2 from left to mid Move 1 from right to mid Move 1 from mid to left Move 2 from mid to right Move 1 from left to mid Move 1 from mid to right It will move 8 steps. */
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/28 4:47:21

暗黑破坏神3终极按键助手:图形化宏工具完整配置指南

暗黑破坏神3终极按键助手&#xff1a;图形化宏工具完整配置指南 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面&#xff0c;可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper D3KeyHelper是一款专为暗黑破坏神3玩…

作者头像 李华
网站建设 2026/4/28 4:45:21

【Doris】Doris 数据模型

1.概述 上一篇文章:【Doris】Doris 数据划分 Doris 的数据模型主要分为3类:Aggregate、Uniq、Duplicatef 2. Aggregate 模型 2.1 概述 表中的列按照是否设置了 AggregationType,分 Key(维度列)和 Value(指标列)。没有设置AggregationType 的称为 Key,设置了 Aggrega…

作者头像 李华
网站建设 2026/4/28 4:44:19

1GB视频如何轻松压缩到80MB?CompressO终极免费开源解决方案

1GB视频如何轻松压缩到80MB&#xff1f;CompressO终极免费开源解决方案 【免费下载链接】compressO Convert any video/image into a tiny size. 100% free & open-source. Available for Mac, Windows & Linux. 项目地址: https://gitcode.com/gh_mirrors/co/compre…

作者头像 李华
网站建设 2026/4/28 4:37:00

终极Consul灾难恢复指南:7步完成集群故障应急响应与数据拯救

终极Consul灾难恢复指南&#xff1a;7步完成集群故障应急响应与数据拯救 【免费下载链接】consul Consul is a distributed, highly available, and data center aware solution to connect and configure applications across dynamic, distributed infrastructure. 项目地址…

作者头像 李华
网站建设 2026/4/28 4:33:28

5个常见ESP32开发难题与Arduino-ESP32的解决方案

5个常见ESP32开发难题与Arduino-ESP32的解决方案 【免费下载链接】arduino-esp32 Arduino core for the ESP32 项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32 你是否在为ESP32开发而烦恼&#xff1f;面对复杂的芯片配置、网络连接不稳定、外设驱动困…

作者头像 李华
网站建设 2026/4/28 4:30:29

优化Piper TTS系统:提升波斯语语音合成的自然度与性能

1. 项目概述与核心挑战语音合成技术&#xff08;Text-to-Speech, TTS&#xff09;作为人机交互的关键环节&#xff0c;其核心目标是将书面文本转换为自然流畅的语音输出。在无障碍服务、智能助手、车载导航等场景中&#xff0c;TTS系统的表现直接影响用户体验。然而&#xff0c…

作者头像 李华