趣味算法——青蛙过河(JAVA)
2015-01-07 00:02
615 查看
青蛙过河是一个非常有趣的智力游戏,其大意如下: 一条河之间有若干个石块间隔,有两队青蛙在过河,每队有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()); } }
相关文章推荐
- 趣味算法-青蛙过河
- java趣味算法(一)——约瑟夫问题
- java-趣味算法
- 18位身份证号码校验码的算法(JAVA)
- Java和C#摘要算法实现
- 一个用Dijkstra算法实现的路由算法的java程序——1 GraphAdjList类
- 在java中实现图形学中的椭圆算法
- Java 算法
- 一道微软算法题的java解法
- Java中的几种算法的实现
- 在java语言计算数据库记录总数的简便算法
- 利用高级Java、算法、三角学、分布计算设计自己的智能机器人
- java数据结构及算法二
- 用Java实现归并排序(Merge-Sort)算法
- java实现的18位身份证格式验证算法
- 上楼梯算法的java实现(转)
- FIFO与LRU 算法实现(java)
- MD5 算法的java实现
- 中国农历算法java实现(转自Herong Yang)
- Java中的几种算法的实现