读书笔记之汉诺塔变型题

这篇读书笔记探讨了汉诺塔问题的一个特殊条件:左边的塔必须通过中间塔才能到达右边。解题策略包括递归方法和利用堆栈优化路径,避免回溯并确保小盘子在大盘子之上。
摘要由CSDN通过智能技术生成

汉诺塔问题增加条件:左边的塔到达右边的塔必须要经过中间的塔才可以


解题思路:

  1. 递归的方式 :如果只有一层塔的情况 以及n层塔的情况
  2. 使用堆栈的方式:考虑最佳的方式中 不能原路返回 以及上边的小于下边的要求

//使用栈的代码
package Charpter1;

import java.util.Stack;

public class hanoiProble2 {
    public static enum Action{
        No,LToM,MToL,MToR,RToM
    }
    public static int hanoiProble(int num,String left,String mid,String right){
        Stack<Integer> lS = new Stack<>();
        Stack<Integer> mS = new Stack<>();
        Stack<Integer> rS = new Stack<>();
        lS.push(Integer.MAX_VALUE);
        mS.push(Integer.MAX_VALUE);
        rS.push(Integer.MAX_VALUE);
        for (int i=num;i>0;i--){
            lS.push(i);
        }
        Action[] record ={Action.No};
        int step=0;
        while(rS.size() != num+1){
            step+=fStackToStack(record,Action.MToL,Action.LToM,lS,mS,left,mid);
            step+=fStackToStack(record,Action.LToM,Action.MToL,mS,lS,mid,left);
            step+=fStackToStack(record,Action.RToM,Action.MToR,mS,rS,mid,right);
            step+=fStackToStack(record,Action.MToR,Action.RToM,rS,mS,right,mid);
        }
        return step;
    }
    public static int fStackToStack(Action [] record,Action preNoAct,Action nowAct,Stack<Integer> fStack,Stack<Integer> tStack,String from,String to){
        if(record[0] !=preNoAct && tStack.peek()>fStack.peek()){
            tStack.push(fStack.pop());
            System.out.println("Move " + tStack.peek() + "from "+from +"to"+to);
            record[0]=nowAct;
            return 1;
        }
        return 0;
    }
    public static void main(String [] args){
        System.out.println(hanoiProble(2,"left","mid","rigth"));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值