美文网首页
汉诺塔问题(进阶)--- 递归方法

汉诺塔问题(进阶)--- 递归方法

作者: Tank_Mao | 来源:发表于2020-10-21 21:53 被阅读0次

【题目】
汉诺塔问题比较经典,这里修改一下游戏规则:现在限制不能从最左侧的塔直接移动到最右侧, 也不能从最右侧直接移动到最左侧,而是必须经过中间。求当塔有N层的时候,打印最优移动过程和最优移动总步数。 例如,当塔数为两层时,最上层的塔记为1,最下层的塔记为2,则打印:
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 moves 8 steps.

【要求】
用以下两种方法解决:
*方法一:递归的方法
*方法二:非递归的方法,用栈来模拟汉诺塔的三个塔。

【解答】
见源代码!

package pers.mao.stackAndQueue.demo_06;

/**
 * @author Mao Qingbo
 * @date 2020-10-04
 */
public class TowersOfHanoi1 {//递归方法
    public int hanoiProblem1(int num ,String left,String mid,String right){
        if(num<1){
            return 0;
        }
        return process(num,left,mid,right,left,right);//from-->left,to-->right
    }

    /**
     *
     * @param num 汉诺塔的层数
     * @param left 左塔
     * @param mid 中塔
     * @param right 右塔
     * @param from 出发塔
     * @param to 目标塔
     * @return 返回步数
     */
    public 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.println("Move 1 from "+from+" to "+to);
                return 1;
            }
            else{
                System.out.println("Move 1 from "+from+" to "+mid);
                System.out.println("Move 1 from "+mid+" to "+to);
                return 2;
            }
        }
        /*
         * 递归情形:有N层塔需要移动(从上到下依次为1~N)
         * 如果,出发塔和目标塔中的一个是中塔,那么需3步走:
         *   1)将1~N-1层从出发塔移动到辅助塔(another);
         *   2)将第N层从出发塔移动到目标塔;
         *   3)将1~N-1层从辅助塔(another)移动到目标塔。
         * 否则,需要5步走:
         *   1)将1~N-1层从出发塔移动到目标塔塔;
         *   2)将第N层从出发塔移动到中塔;
         *   3)将1~N-1层从目标塔移动到出发塔;
         *   4)将第N层从中塔移动到目标塔;
         *   5)将1~N层从出发塔移动到目标塔。
         */
        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.println("Move "+num+" from "+from+" to "+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.println("Move "+num+" from "+from+" to "+mid);
            int part3 = process(num-1,left,mid,right,to,from);
            int part4 = 1;
            System.out.println("Move "+num+" from "+mid+" to "+to);
            int part5 = process(num-1,left,mid,right,from,to);
            return part1+part2+part3+part4+part5;
        }
    }

}

相关文章

  • 汉诺塔问题(进阶)--- 递归方法

    【题目】汉诺塔问题比较经典,这里修改一下游戏规则:现在限制不能从最左侧的塔直接移动到最右侧, 也不能从最右侧直接移...

  • 数据结构与算法-递归分治-汉诺塔思想

    折半查找算法的递归实现 思想:减少查找序列的长度,分而治之地进行关键字的查找 汉诺塔问题 汉诺塔是我们递归思想,分...

  • 数据结构算法之递归和栈结构

    递归 程序调用自身的编程技巧称为递归简单案例:n的阶乘 汉诺塔 汉诺塔问题描述:3个柱为a、b、c,圆盘最初在a柱...

  • Python 汉诺塔的实现

    汉诺塔的实现,是一个典型的递归问题,当然越是复杂的递归问题越是考验人的抽象思维; 哈哈哈,言归正传,汉诺塔问题如下...

  • 汉诺塔递归

    学习汉诺塔递归算法

  • Python3 趣味系列题4 ------非递归解决

      人们通常利用递归的方法求解汉诺塔问题。递归程序的实现比较简单,但是难于理解。下面给出python3的递归程序:...

  • python例子

    利用递归函数移动汉诺塔

  • 递归——汉诺塔问题

    我参考了两位大佬的代码,其中一位是日本的专业程序员。比较有意思的是他出的面向要考试的群体的那本书讲了这个,后来大概...

  • 复杂递归问题:汉诺塔

    复杂递归问题:汉诺塔 汉诺塔问题是法国数学家Edouard Lucas于1883年, 根据传说提出来的。 传说在一...

  • 算法分析与设计

    递归汉诺塔问题: https://blog.csdn.net/xb2355404/article/details/...

网友评论

      本文标题:汉诺塔问题(进阶)--- 递归方法

      本文链接:https://www.haomeiwen.com/subject/ujhymktx.html