资讯动态

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

发布时间:2026/10/11 0:05:38 来源:尧图企业网站定制
分享一个大牛的人工智能教程。零基础通俗易懂风趣幽默希望你也加入到人工智能的队伍中来请轻击人工智能教程大家好欢迎来到我的网站 人工智能被认为是一种拯救世界、终结世界的技术。毋庸置疑人工智能时代就要来临了科… 继续阅读 前言https://www.captainai.net/troubleshooterpackage live.every.day.ProgrammingDesign.CodingInterviewGuide.StackAndQueue; /** * 用栈来求解汉诺塔问题 * * 【题目】 * 汉诺塔问题比较经典这里修改一下游戏规则限制不能从最左侧的塔直接移动到最右侧也不能从最右侧直接移动到最左侧而是必 * 须经过中间。求当塔有N层的时候打印最优移动过程和最优移动总步数。 * * 【要求】 * 用以下两种方法解决。 * 方法一递归的方法 * 方法二非递归的方法用栈来模拟汉诺塔的三个塔。 * * 【难度】 * 困难 * * 【解答】 * 方法一递归的方法。 * * 首先如果只剩最上层的塔需要移动则有如下处理 * 、如果希望从左移到中打印Move 1 from left to mid。 * 、如果希望从中移到左打印Move 1 from mid to left。 * 、如果希望从中移到右打印Move 1 from mid to right。 * 、如果希望从右移到中打印Move 1 from right to mid。 * 、如果希望从左移到右打印Move 1 from left to mid和Move 1 from mid to right。 * 、如果希望从右移到左打印Move 1 from right to mid和Move 1 from mid to left。 * 以上过程就是递归的终止条件也就是只剩上层塔时的打印过程。 * * 接下来我们分析剩下多层塔的情况。 * 如果剩下N层塔从最上到最下依次为1~N则有如下判断 * 、如果剩下的N层塔都在左希望全部移到中则有三个步骤。 * 将1~N-1层塔先全部从左移到右明显交给递归过程。 * 将第N层塔从左移到中。 * 再将1~N-1层塔全部从右移到中明显交给递归过程。 * 、如果把剩下的N层塔从中移到左从中移到右从右移到中过程与情况1同理一样是分解为三步在此不再详 * 述。 * 、如果剩下的N层塔都在左希望全部移到右则有五个步骤。 * 将1~N-1层塔先全部从左移到右明显交给递归过程。 * 将第N层塔从左移到中。 * 将1~N-1层塔全部从右移到左明显交给递归过程。 * 将第N层塔从中移到右。 * 最后将1~N-1层塔全部从左移到右明显交给递归过程。 * 、如果剩下的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. */

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑