在线编程--汉诺塔问题

题目描述

对于传统的汉诺塔游戏我们做一个拓展,我们有从大到小放置的n个圆盘,开始时所有圆盘都放在左边的柱子上,按照汉诺塔游戏的要求我们要把所有的圆盘都移到右边的柱子上,请实现一个函数打印最优移动轨迹。
给定一个int n,表示有n个圆盘。请返回一个string数组,其中的元素依次为每次移动的描述。描述格式为: move from [left/mid/right] to [left/mid/right]。
测试样例:
1
返回:move from left to right

import java.util.*;

public class Hanoi {
    static ArrayList<String> arr=new ArrayList<String>();
    public ArrayList<String> getSolution(int n) {
        // write code here
        String left="left";
        String mid="mid";
        String right="right";
        hanoiProblems(n,left, mid, right);
        return arr;
    }
    public enum Action{
        No,LToM,MToL,MToR,RToM
    }
    public int hanoiProblems(int n,String left,String mid,String right){
        Stack<Integer> ls=new Stack<Integer>();
        Stack<Integer> ms=new Stack<Integer>();
        Stack<Integer> rs=new Stack<Integer>();
        ls.push(Integer.MAX_VALUE);
        ms.push(Integer.MAX_VALUE);
        rs.push(Integer.MAX_VALUE);
        for(int i=n;i>0;i--){
            ls.push(i);  //将数字压入栈内
        }   
        Action[] record={Action.No};
        int step=0;
        while(rs.size()!=n+1){
            step+=fStackTotStack(record, Action.MToL, Action.LToM, ls, ms, left, mid);
            step+=fStackTotStack(record, Action.LToM, Action.MToL, ms, ls, mid, left);
            step+=fStackTotStack(record, Action.RToM, Action.MToR, ms, rs, mid, right);
            step+=fStackTotStack(record, Action.MToR, Action.RToM, rs, ms, right, mid);         
        }
        return step;
     }

     public static int fStackTotStack(Action[] record,Action preNoAct,Action nowAct,Stack<Integer> fStack,Stack<Integer> tStack, String from,String to){
        if(record[0]!=preNoAct&&fStack.peek()<tStack.peek()){
            tStack.push(fStack.pop());
            arr.add("Move "+tStack.peek()+" from "+from+" to "+to);
            record[0]=nowAct;
            return 1;
        }
        return 0;
     }  
}
    原文作者: 汉诺塔问题
    原文地址: https://blog.csdn.net/Mrzhoug/article/details/51050877
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞