猿问

青蛙过河问题!注释写的不咋地,有错误。希望大神解释这个程序的rollback()和record()方法怎么算的?

package com.demo.hwj.javademo.kotlin;


import java.util.Arrays;//要使用工具类;


public class Testing {

static int[] mInput = {1, 2, 3, 0, 9, 10, 11};//这是之前的顺序;这里静态的作用便是方便之后复制;

    static int[] mStep = new int[100];//步数

    static int[] mResult = {9, 10, 11, 0, 1, 2, 3};//这是之后的顺序

    static int mBridgeIndex = 0;//中间的坐标

    static int[] mLeft = null;//左边操作的数组

    static int[] mRight = null;//右边操作的数组

    static int stepPosition = 0;//当前步的坐标


    public static void main(String[] args) {

        init();//初始化

        start();//开始

    }


    private static void start() {

        do {

            switch (mStep[stepPosition]) {

                case 1:

                    if (move(1, 1)) {

                        break;

                    }

                case 2:

                    if (move(1, 2)) {

                        break;

                    }

                case 3:

                    if (move(2, 1)) {

                        break;

                    }

                case 4:

                    if (!move(2, 2)) {

                        //reset mInput ,rollback mStep

                        rollback();

                        continue;

                    }

            }

            stepPosition++;

        } while (!Arrays.equals(mResult, mInput));

        outputStep();

    }

    

//这个方法就是输出运动的实况吧;

    

    private static void outputStep() {

        int[] finallyStep = Arrays.copyOf(mStep, stepPosition);

        reset();//

        for (int i = 0; i < finallyStep.length; i++) {

            switch (finallyStep[i]) {

                case 1:

                    moveLeft(1);

                    System.out.printf(i + ":  Left walking =>" + Arrays.toString(mInput) + "\n");

                    break;

                case 2:

                    moveLeft(2);

                    System.out.printf(i + ":  Left jumping =>" + Arrays.toString(mInput) + "\n");

                    break;

                case 3:

                    moveRight(1);

                    System.out.printf(i + ":  Right walking =>" + Arrays.toString(mInput) + "\n");

                    break;

                case 4:

                    moveRight(2);

                    System.out.printf(i + ":  Right jumping =>" + Arrays.toString(mInput) + "\n");

                    break;

            }

        }

    }

//这是初始化,初始化游戏的;

    private static void init() {

        mBridgeIndex = mInput.length / 2;// get middle bridge's position,用来获取中间的坐标;

        mLeft = Arrays.copyOfRange(mInput, 0, mBridgeIndex);//将左边的数组用Arrays工具类的copy of range()方法将从0到中间复制到新数组中;

        mRight = Arrays.copyOfRange(mInput, mBridgeIndex + 1, mInput.length);//同左;

        Arrays.fill(mStep, 1);//将Setp数组用1填充;

    }


    /**

     * move input child element .include all the way for move

     *

     * @param direction    the direction for move.  1 means left,2 means right

     * @param stepInterval the way for move. 1 means walking,2 means jumping

     */

    //这是运动的总类,包含了所有的移动方式;

    private static boolean move(final int direction, final int stepInterval) {

    //这里主要是发现是否有异常;

        if (stepInterval != 1 && stepInterval != 2)

            new IllegalArgumentException(" stepInterval must equal 1 or 2.  -----> line 65");

        if (direction != 1 && direction != 2)

            new IllegalArgumentException(" direction must equal 1 or 2.-----> line 65");

        boolean isWalking;

        //这里要判断移动的方式,有跳和走,有左有右

        if (direction == 1) {

            isWalking = moveLeft(stepInterval);

        } else {

            isWalking = moveRight(stepInterval);

        }

        //当被指向时候进行判断;

        if (isWalking) {

            //record down step

            record(direction, stepInterval);

        }

        return isWalking;

    }


    private static void record(int direction, int step) {

   

        switch (direction) {

            case 1:

                mStep[stepPosition] = direction * step;

                break;

            case 2:

                mStep[stepPosition] = direction + step;

                break;

        }

    }


    private static void rollback() {

        if (mStep[stepPosition] >= 4) {

            mStep[stepPosition] = 1;

            stepPosition--;

        }

        if (stepPosition < 0) 

        stepPosition = 0;

        if (mStep[stepPosition] < 4) {

            mStep[stepPosition]++;

            reset();

        }



    }


    /**

     * move input child element .include  the way for move is Left

     *

     * @param stepInterval the way for move. 1 means walking,2 means jumping

     * @return if return false that means cannot moving

     */

    //左向的方法

    private static boolean moveLeft(final int stepInterval) {

        for (int i = 0; i < mInput.length; i++) {

            if (containOf(mLeft, mInput[i])) {// search item whether inside for mInput

                if (i < mInput.length - stepInterval && mInput[i + stepInterval] == 0) {

                    //change item

                    int a = mInput[i];

                    mInput[i + stepInterval] = a;

                    mInput[i] = 0;

                    return true;

                }

            }

        }

        return false;

    }

    //右向的方法

    private static boolean moveRight(final int stepInterval) {

        for (int i = mInput.length - 1; i >= 0; i--) {

            if (containOf(mRight, mInput[i])) {// search item whether inside for mInput

                if (i >= 0 + stepInterval && mInput[i - stepInterval] == 0) {

                    //change item

                    mInput[i - stepInterval] = mInput[i];

                    mInput[i] = 0;

                    return true;

                }

            }

        }

        return false;

    }


    private static boolean containOf(int[] arr, int child) {

        for (int i : arr) {

            if (i == child) 

            return true;

        }

        return false;

    }


    private static void reset() {


        mInput[0] = 1;

        mInput[1] = 2;

        mInput[2] = 3;

        mInput[3] = 0;

        mInput[4] = 4;

        mInput[5] = 5;

        mInput[6] = 6;

        stepPosition = 0;

    }

}


Arnao
浏览 1038回答 1
1回答

慕标5263832

太长不阅
随时随地看视频慕课网APP

相关分类

Java
我要回答