趣味算法——青蛙過河(JAVA)


 

  青蛙過河是一個非常有趣的智力游戲,其大意如下: 一條河之間有若干個石塊間隔,有兩隊青蛙在過河,每隊有3只青蛙,這些青蛙只能向前移動,不能向后移動,且一次只能有一只青蛙向前移動。在移動過程中,青蛙可以向前面的空位中移動,不可以一次跳過兩個位置,但是可以跳過對方一只青蛙進入到前面的一個空位。問兩隊青蛙該如何移動才能用最少的步數分別走向對岸?( → → → □ ← ← ← )可能3只青蛙太少了,心算也不難。如果有100只青蛙呢?

 

/**
 * 青蛙過河
 * @author rubekid
 *
 */
public class RiverFrog {
    
    public static final int LEFT_FROG = -1;
    
    public static final int RIGHT_FROG = 1;
    
    public static final int STONE = 0;

    private int[] frogs;
    
    private int zeroIndex;
    
    private int length;

    private int step = 0;
    
    public RiverFrog(int number) {
        frogs = new int[number * 2 +1];
        length = frogs.length;
        zeroIndex = length /2;
        for(int i=0; i< number; i++){
            frogs[i] = LEFT_FROG;
        }
        frogs[zeroIndex] = STONE;
        for(int i=0; i< number; i++){
            frogs[i+ zeroIndex + 1] = RIGHT_FROG;
        }
        
    }
    
    public void run(){

        while(!isMoveEnd(LEFT_FROG) || !isMoveEnd(RIGHT_FROG)){
            int left = zeroIndex - 1;
            int right = zeroIndex+1;
            
            if(left>-1 && right <length){
                if(frogs[left] != frogs[right]){
                    if(frogs[left] == LEFT_FROG){
                        if(left > 0 && frogs[left-1] == RIGHT_FROG){//若移動right,則在中間有兩只RIGHT並排
                            this.move(right);
                        }
                        else{
                            this.move(left);
                        }
                    }
                    else if(left > 0 && frogs[left-1]==LEFT_FROG ){
                        this.move(left-1);
                    }
                    else if(right <= length && frogs[right+1] == RIGHT_FROG){
                        this.move(right+1);
                    }
                }
                else{
                    if(frogs[left] == RIGHT_FROG){
                        if(left > 0 && frogs[left-1] == LEFT_FROG){
                            this.move(left - 1);
                        }
                        else if(right+1 < length && frogs[right+1] == RIGHT_FROG){
                            this.move(right+1);
                        }
                        else if(frogs[right] == RIGHT_FROG){
                            this.move(right);
                        }
                    }
                    else if(frogs[right] == LEFT_FROG){
                        if(right+1 < length && frogs[right+1] == RIGHT_FROG){
                            this.move(right + 1);
                        }
                        else if(left >0 && frogs[left-1] == LEFT_FROG){
                            this.move(left-1);
                        }
                        else if(frogs[left] == LEFT_FROG){
                            this.move(left);
                        }
                    }
                }
            }
            else if(left == -1){
                if(frogs[right] == LEFT_FROG && right<length-1){
                    this.move(right+1);
                }
                else{
                    this.move(right);
                }
            }
            else if(right == length){
                if(frogs[left] == RIGHT_FROG && left > 0){
                    this.move(left-1);
                }
                else{
                    this.move(left);
                }
            }
        }
        System.out.println("step:" + step);
    }

    
    private void move(int i){
        int temp = frogs[i];
        frogs[i] = frogs[zeroIndex];
        frogs[zeroIndex] = temp;
        zeroIndex = i;
        step++;
        print();
    }
    
    private boolean isMoveEnd(int value){
        int i=0; int max= zeroIndex;
        if(value == LEFT_FROG){
            i = zeroIndex+1;
            max = length;
        }
        for(int j=i; j<max; j++){
            if(frogs[j]!=value){
                return false;
            }
        }
        return true;
    }
    
    private void print(){
        StringBuffer stringBuffer = new StringBuffer();
        for(int frog : frogs){
            if(frog>-1){
                stringBuffer.append(" " +frog + "    ");
            }
            else{
                stringBuffer.append(frog + "    ");
            }
            
        }
        System.out.println(stringBuffer.toString());
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM