趣味算法——青蛙过河(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());
}
}
趣味算法——青蛙过河(JAVA)的更多相关文章
- Java实现 LeetCode 403 青蛙过河
403. 青蛙过河 一只青蛙想要过河. 假定河流被等分为 x 个单元格,并且在每一个单元格内都有可能放有一石子(也有可能没有). 青蛙可以跳上石头,但是不可以跳入水中. 给定石子的位置列表(用单元格序 ...
- [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 ...
- 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算法求最短路径(java)(转)
原文链接:Dijkstra算法求最短路径(java) 任务描述:在一个无向图中,获取起始节点到所有其他节点的最短路径描述 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到 ...
- 排序算法总结(基于Java实现)
前言 下面会讲到一些简单的排序算法(均基于java实现),并给出实现和效率分析. 使用的基类如下: 注意:抽象函数应为public的,我就不改代码了 public abstract class Sor ...
- 常见排序算法题(java版)
常见排序算法题(java版) //插入排序: package org.rut.util.algorithm.support; import org.rut.util.algorithm.Sor ...
随机推荐
- js 得到当前季度
Date.prototype.getQuarter = function() { var month = this.getMonth(); if(month < 3) { return '第一季 ...
- 面向对象设计模式之Flyweight享元模式(结构型)
动机:采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行代价——主要指内存需求方面的代价.如何在避免大量细粒度对象问题的同 时,让外部客户程序仍然能够透明地使用面向对象的 ...
- jQuery图片提示示例
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Python3 如何优雅地使用正则表达式(详解一)
注:本文翻译自 Regular Expression HOWTO,小甲鱼童鞋对此做了一些注释和修改. 正则表达式介绍 正则表达式(Regular expressions 也称为 REs,或 regex ...
- 基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同 but------> 可以返回派生类对象的引用或指针
您查询的关键词是:c++primer习题15.25 以下是该网页在北京时间 2016年07月15日 02:57:08 的快照: 如果打开速度慢,可以尝试快速版:如果想更新或删除快照,可以投诉快照. ...
- uva 580 危险的组合(排列组合)
Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Submit Status Descript ...
- laravel框架——路由
基本路由: Route::get('/', function () { return view('welcome'); }); Route::post('/', function () { retur ...
- Callback函数详解(我感觉,回掉函数的本质是函数指针,在业务做循环处理的时候,调用一下通知外部)
2010年的最后一天了,转载一篇自己认为还不错的文章与大家分享.希望对大家有所帮助. 一,回调函数 我们经常在C++设计时通过使用回调函数可以使有些应用(如定时器事件回调处理.用回调函数记录某操作进度 ...
- XML初学笔记
一.基本概要: XML,全称是eXtensible Markup Language,可扩展的标记语言,是Web服务的基础之一,使用XML,用户可以定义自己需要的标记.而用户创建的标记可以使用文档类型定 ...
- GMU
NEXT | 不错过任何一个新产品 百度开源 Mobile UI 组件库,提供 Web app.Pad 端简单易用的 UI 组件 发表评论