青蛙過河是一個非常有趣的智力游戲,其大意如下: 一條河之間有若干個石塊間隔,有兩隊青蛙在過河,每隊有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()); } }