趣味算法——青蛙过河(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());
    }
}
时间: 2024-10-12 20:41:14

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

Dijkstra算法(三)之 Java详解

前面分别通过C和C++实现了迪杰斯特拉算法,本文介绍迪杰斯特拉算法的Java实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法图解 3. 迪杰斯特拉算法的代码说明 4. 迪杰斯特拉算法的源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结构与算法系列 目录 迪杰斯特拉算法介绍 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想

P1244 青蛙过河

P1244 青蛙过河 题目描述 有一条河,左边一个石墩(A区)上有编号为1,2,3,4,-,n的n只青蛙,河中有k个荷叶(C区),还有h个石墩(D区),右边有一个石墩(B区),如下图所示.n只青蛙要过河(从左岸石墩A到右岸石墩B),规则为: (1)石墩上可以承受任意多只青蛙,荷叶只能承受一只青蛙(不论大小): (2)青蛙可以:A→B(表示可以从A跳到B,下同),A→C,A→D,C→B,D→B,D→C,C→D: (3)当一个石墩上有多只青蛙时,则上面的青蛙只能跳到比它大1号的青蛙上面. 你的任务是

NOIP 2005 青蛙过河

做题记录:2016-08-10 21:58:09 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:0,1,……,L(其中L是桥的长度).坐标为0的点表示桥的起点,坐标为L的点表示桥的终点.青蛙从桥的起点开始,不停的向终点方向跳跃.一次跳跃的距离是S到T之间的任意正整数(包括S,T).当青蛙跳到或跳过坐标为L的点时,就算青蛙已经跳出

PHP 3DES 算法,与Java中的DESede兼容

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 <?php class Crypt3Des {     public $key = &qu

Kruskal算法(三)之 Java详解

前面分别通过C和C++实现了克鲁斯卡尔,本文介绍克鲁斯卡尔的Java实现. 目录 1. 最小生成树 2. 克鲁斯卡尔算法介绍 3. 克鲁斯卡尔算法图解 4. 克鲁斯卡尔算法分析 5. 克鲁斯卡尔算法的代码说明 6. 克鲁斯卡尔算法的源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结构与算法系列 目录 最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的

趣味算法总目录

趣味算法总目录: 排序部分: 归并排序(Merge sort) 堆排序 快速排序 && 希尔排序 && 插入排序 基数排序 排列与组合: 排列 && 组合 网络流问题: 最大流问题 数学问题: 奇妙的数学 1. 约瑟夫(环)问题. 2. 不用任何中间变量交换两个变量 a 和 b 的值. 3. 不用加减乘除求两个整数的和. 4. 不用乘.除.取余运算实现两个 int 值相除. 5. 找数组中单数问题 6. ACM: 今天是星期一,再过 1^1+2^2+3^3+

HLG 1584 青蛙过河 (二分)

链接: http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1584 Description 青蛙王国一年一度的游戏又开始了,这个游戏要求青蛙必须跳过河.河的宽度是 L .河里有n块石头,这n块石头从河的一边笔直的连到另一边.青蛙只能踩着石头过河,如果它们掉到水里,将被淘汰出局.游戏规定青蛙最多跳m次.现在青蛙想要知道如果在这m步内跳到岸的那边,它一步最长需要跳多长. Input 输入包括多组测试

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

原文链接:Dijkstra算法求最短路径(java) 任务描述:在一个无向图中,获取起始节点到所有其他节点的最短路径描述 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表方式用OPEN,CLOSE表的方式,其采用的是贪心法的算法策略,大概过程如下:1.声明两个集合,open和close

ooj 1066 青蛙过河DP

http://121.249.217.157/JudgeOnline/problem.php?id=1066 1066: 青蛙过河 时间限制: 1 Sec  内存限制: 64 MB提交: 58  解决: 13[提交][状态][讨论版] 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上. 由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整数: 0,1,……,L(其中L是桥的长度). 坐标