java 独木桥_趣味算法——青蛙过河(JAVA)

博客内容介绍了青蛙过河问题的详细规则,并提供了一个Java实现的示例代码,通过模拟青蛙的移动来找到最优解。代码中定义了青蛙的状态和移动规则,以完成两队青蛙在有限空间内有效移动的逻辑。
摘要由CSDN通过智能技术生成

青蛙过河是一个非常有趣的智力游戏,其大意如下: 一条河之间有若干个石块间隔,有两队青蛙在过河,每队有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

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

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

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实现 LeetCode 403 青蛙过河

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

&lbrack;LeetCode&rsqb; Frog Jump 青蛙过河

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

NOIP 2005 青蛙过河

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

ooj 1066 青蛙过河DP

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

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

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

P1244 青蛙过河

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

Dijkstra算法求最短路径&lpar;java&rpar;(转)

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

排序算法总结&lpar;基于Java实现&rpar;

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

常见排序算法题(java版)

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

随机推荐

AEAI DP开发平台精要

1 背景概述 相信很多了解数通畅联软件的人对AEAI DP应用开发平台并不陌生,笔者在入职第一天就开始接触AEAI DP,使用AEAI DP开发过AEAI WM.AEAI CRM以及中国XXXX管理系 ...

比较全的JavaScript倒计时脚本&lbrack;xyytit&rsqb;

需要做一个功能,给特定的活动或者商品添加一个倒计时提示,在网上找了好些方法,总结了比较好的一些方法,以备后用: 1. 比较长时间的倒计时(如:距离2014年还有0年, 0月, 30天, 9小时, 41 ...

NYOJ背包问题

#include struct group{ int value; int weight; }; void Sort(group bag[],int num) { in ...

栈——PowerShell版

上一篇讲过队列(queue),队列就像是居民楼里的垃圾管道,从楼道的垃圾管道的入口处将垃圾扔进去,清洁工会从一楼垃圾管道的出口处将垃圾拿走.每一层的垃圾通道入口与一楼的垃圾管道出口之间都形成了一个队列 ...

&lpar;三&rpar;CSS高级语法

选择器分组 可以对选择器进行分组,被分组的选择器可以分享相同的声明,用逗号将需要分组的选择器分开.例如: h1,h2,h3,h4,h5,h6 { color: green; } 继承以及其问题一般,子 ...

Ubuntu上64位adv无法创建问题

Ubuntu上安装android开发环境,前面都成功了,但到了最后创建adv的时候却总是失败. 出现了这个问题.最后,上网找了这个教程http://blog.sina.com.cn/s/blog_66 ...

C&plus;&plus; Primer 有感(命名空间)

1.命名空间定义以关键字namespace开始,后接命名空间的名字. 2.命名空间可以在全局作用域或其他作用域内部定义,但不能在函数或类内部定义. 3.定义在命名空间中的实体称为命名空间的成员.像任意 ...

wireshark使用方法

抓取报文: 下载和安装好Wireshark之后,启动Wireshark并且在接口列表中选择接口名,然后开始在此接口上抓包.例如,如果想要在无线网络上抓取流量,点击无线接口.点击Capture Opti ...

UVA-1619 Feel Good (单调队列)

题目大意:给一个非负整数序列,求出一个使得区间和乘以区间最小值最大的区间. 题目分析:单调队列.维护两个数组,l[i]表示以a[i]为最小值的左半区间的最左边端点,r[i]表示以a[i]为最小值的右半 ...

TCP&sol;IP三次握手与四次握手

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值