青蛙过河是一个非常有趣的智力游戏,其大意如下: 一条河之间有若干个石块间隔,有两队青蛙在过河,每队有3只青蛙,这些青蛙只能向前移动,不能向后移动,且一次只能有一只青蛙向前移动。在移动过程中,青蛙可以向前面的空位中移动,不可以一次跳过两个位置,但是可以跳过对方一只青蛙进入到前面的一个空位。问两队青蛙该如何移动才能用最少的步数分别走向对岸?( → → → □ ← ← ← )可能3只青蛙太少了,心算也不难。如果有100只青蛙呢?

  1. /**
  2. * 青蛙过河
  3. * @author rubekid
  4. *
  5. */
  6. public class RiverFrog {
  7.  
  8. public static final int LEFT_FROG = -1;
  9.  
  10. public static final int RIGHT_FROG = 1;
  11.  
  12. public static final int STONE = 0;
  13.  
  14. private int[] frogs;
  15.  
  16. private int zeroIndex;
  17.  
  18. private int length;
  19.  
  20. private int step = 0;
  21.  
  22. public RiverFrog(int number) {
  23. frogs = new int[number * 2 +1];
  24. length = frogs.length;
  25. zeroIndex = length /2;
  26. for(int i=0; i< number; i++){
  27. frogs[i] = LEFT_FROG;
  28. }
  29. frogs[zeroIndex] = STONE;
  30. for(int i=0; i< number; i++){
  31. frogs[i+ zeroIndex + 1] = RIGHT_FROG;
  32. }
  33.  
  34. }
  35.  
  36. public void run(){
  37.  
  38. while(!isMoveEnd(LEFT_FROG) || !isMoveEnd(RIGHT_FROG)){
  39. int left = zeroIndex - 1;
  40. int right = zeroIndex+1;
  41.  
  42. if(left>-1 && right <length){
  43. if(frogs[left] != frogs[right]){
  44. if(frogs[left] == LEFT_FROG){
  45. if(left > 0 && frogs[left-1] == RIGHT_FROG){//若移动right,则在中间有两只RIGHT并排
  46. this.move(right);
  47. }
  48. else{
  49. this.move(left);
  50. }
  51. }
  52. else if(left > 0 && frogs[left-1]==LEFT_FROG ){
  53. this.move(left-1);
  54. }
  55. else if(right <= length && frogs[right+1] == RIGHT_FROG){
  56. this.move(right+1);
  57. }
  58. }
  59. else{
  60. if(frogs[left] == RIGHT_FROG){
  61. if(left > 0 && frogs[left-1] == LEFT_FROG){
  62. this.move(left - 1);
  63. }
  64. else if(right+1 < length && frogs[right+1] == RIGHT_FROG){
  65. this.move(right+1);
  66. }
  67. else if(frogs[right] == RIGHT_FROG){
  68. this.move(right);
  69. }
  70. }
  71. else if(frogs[right] == LEFT_FROG){
  72. if(right+1 < length && frogs[right+1] == RIGHT_FROG){
  73. this.move(right + 1);
  74. }
  75. else if(left >0 && frogs[left-1] == LEFT_FROG){
  76. this.move(left-1);
  77. }
  78. else if(frogs[left] == LEFT_FROG){
  79. this.move(left);
  80. }
  81. }
  82. }
  83. }
  84. else if(left == -1){
  85. if(frogs[right] == LEFT_FROG && right<length-1){
  86. this.move(right+1);
  87. }
  88. else{
  89. this.move(right);
  90. }
  91. }
  92. else if(right == length){
  93. if(frogs[left] == RIGHT_FROG && left > 0){
  94. this.move(left-1);
  95. }
  96. else{
  97. this.move(left);
  98. }
  99. }
  100. }
  101. System.out.println("step:" + step);
  102. }
  103.  
  104. private void move(int i){
  105. int temp = frogs[i];
  106. frogs[i] = frogs[zeroIndex];
  107. frogs[zeroIndex] = temp;
  108. zeroIndex = i;
  109. step++;
  110. print();
  111. }
  112.  
  113. private boolean isMoveEnd(int value){
  114. int i=0; int max= zeroIndex;
  115. if(value == LEFT_FROG){
  116. i = zeroIndex+1;
  117. max = length;
  118. }
  119. for(int j=i; j<max; j++){
  120. if(frogs[j]!=value){
  121. return false;
  122. }
  123. }
  124. return true;
  125. }
  126.  
  127. private void print(){
  128. StringBuffer stringBuffer = new StringBuffer();
  129. for(int frog : frogs){
  130. if(frog>-1){
  131. stringBuffer.append(" " +frog + " ");
  132. }
  133. else{
  134. stringBuffer.append(frog + " ");
  135. }
  136.  
  137. }
  138. System.out.println(stringBuffer.toString());
  139. }
  140. }

趣味算法——青蛙过河(JAVA)的更多相关文章

  1. Java实现 LeetCode 403 青蛙过河

    403. 青蛙过河 一只青蛙想要过河. 假定河流被等分为 x 个单元格,并且在每一个单元格内都有可能放有一石子(也有可能没有). 青蛙可以跳上石头,但是不可以跳入水中. 给定石子的位置列表(用单元格序 ...

  2. [LeetCode] Frog Jump 青蛙过河

    A frog is crossing a river. The river is divided into x units and at each unit there may or may not ...

  3. NOIP 2005 青蛙过河

    做题记录:2016-08-10 21:58:09 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都 ...

  4. ooj 1066 青蛙过河DP

    http://121.249.217.157/JudgeOnline/problem.php?id=1066 1066: 青蛙过河 时间限制: 1 Sec  内存限制: 64 MB提交: 58  解决 ...

  5. HRBUST 1186 青蛙过河 (思路错了)

    在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串 ...

  6. P1244 青蛙过河

    P1244 青蛙过河NOI2000主要思想:数学归纳法 递推 压位高精度 化归 理解能力和找规律的能力题意再述:1.青蛙从上到下必须连续递增或者下面是石墩 而不能是1 12 33 4而且每时每刻都要满 ...

  7. Dijkstra算法求最短路径(java)(转)

    原文链接:Dijkstra算法求最短路径(java) 任务描述:在一个无向图中,获取起始节点到所有其他节点的最短路径描述 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到 ...

  8. 排序算法总结(基于Java实现)

    前言 下面会讲到一些简单的排序算法(均基于java实现),并给出实现和效率分析. 使用的基类如下: 注意:抽象函数应为public的,我就不改代码了 public abstract class Sor ...

  9. 常见排序算法题(java版)

    常见排序算法题(java版) //插入排序:   package org.rut.util.algorithm.support;   import org.rut.util.algorithm.Sor ...

随机推荐

  1. FLEX 网格布局及响应式处理

    上一篇文章用Flex实现BorderLayout,这一章我们来实现常用的网格布局和响应式处理. 首先我们定义HTML结构,主Box为grid,每项为grid-cell,下面就是我们HTML代码结构. ...

  2. javascript 字符串滚动显示

    <html> <head> <script type="text/javascript"> var chars = "JavaScri ...

  3. JQUERY1.9学习笔记 之内容过滤器(二) 空元素选择器

    描述:选择没有子元素(包括文本节点)的标签. jQuery(":empty") 与:parent相反. 例:找出所有为空的元素.(他们没有子元素或文本元素). <!docty ...

  4. [Python笔记]第八篇:模块

    本篇主要内容:python常用模块用法介绍 什么是模块 模块,用一大段代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性 ...

  5. (转) IsPostBack的用法

    某一天在网上看到有人写了这样一段代码: protected void Page_Load(object sender, EventArgs e)     {         if (!IsPostBa ...

  6. socket函数

    为了执行网络IO,一个进程必须做的第一件事就是调用socket函数,指定期望的通信协议类型 int socket(int family,int type,int protocol); 其中,famil ...

  7. Java System类

    java 不支持 全局方法 和 变量, system 类 中所有成员都是静态的, 而要引用这些变量和方法,可直接system作为前缀,

  8. iOS开发网络篇—JSON数据的解析

    iOS开发网络篇—JSON数据的解析 iOS开发网络篇—JSON介绍 一.什么是JSON JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式 ...

  9. 前端工程之模块化(来自百度FEX)

    模块化 是一种处理复杂系统分解成为更好的可管理模块的方式,它可以把系统代码划分为一系列职责单一,高度解耦且可替换的模块,系统中某一部分的变化将如何影响其它部分就会变得显而易见,系统的可维护性更加简单易 ...

  10. 【JavsScript】关于javascript的路线

    Client JS: Level 1 基本对象的掌握----------------------------------------->Library(兼容)/Widget(UI+功能)---- ...