码迷,mamicode.com
首页 > 其他好文 > 详细

跳跃游戏

时间:2018-05-18 20:40:20      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:选择   整数   for   游戏   ann   ring   算法   贪心   tin   

问题描述

给定一个非负整数数组,假定你的初始位置为数组第一个下标。
数组中的每个元素代表你在那个位置能够跳跃的最大长度。
请确认你是否能够跳跃到数组的最后一个下标。
例如:
A=[2,3,1,1,4] 能够跳跃到最后一个下标,输出true
A=[3,2,1,0,4] 不能跳跃到最后一个下标,输出false

输入格式

第一行输入一个正整数 n (1 ≤ n ≤ 500),接下来的一行 n 个整数,输入数组 A[n]。

输出格式

如果能跳到最后一个下标,输出true,否则输出false

代码

参考代码一

package javaexam;

import java.util.Scanner;

public class IsJumpToEnd
{
    public static void main(String[] args)
    {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        int farthest = 0;
        int[] A = new int[n];
        
        for(int i = 0; i < n; ++i)
        {
            A[i] = input.nextInt();
            if(farthest < i)
            {
                System.out.print(false);
                break;
            }
            
            farthest = Math.max(farthest, A[i] + i);
            if(farthest >= n - 1)
            {
                System.out.print(true);
                break;
            }
        }
    }
}

参考代码二

import java.util.*;

public class Main {
    public static void main(String args[])
    {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        /*
        思路:贪心算法;
        从第一个开始,寻找一个可以跳最远的点;
        例如:a[7]={3,1,2,4,1,0,0}
                   0  1 2  3  4 5  6
        1.从第一个位置0,可以跳到位置1、2、3;
        2.如果跳到位置1,那么最远可跳到(1+a[1]);
        3.如果跳到位置2,那么最远可跳到(2+a[2]);
        4.如果跳到位置3,那么最远可跳到(3+a[3]);
        5.故选择跳到位置3,重复上述步骤;
        
        算法分析:
        1.如果选择跳到位置3,就无法选择跳到位置1和位置2,那么会不会错过最优解呢?不会!
        2.因为位置1、2能到达的位置,位置3都可达;
        3.故不会错过最优解。
        */
        
        int[] a = new int[n];
        for(int i = 0; i < n; ++i)
        {
            a[i] = input.nextInt();
        }
        
        int i;
        int r; //控制搜索终止位置
        int l; //控制搜索开始位置
        for(i = 0; i < n && a[i] != 0;) //当a[i]=0时,该位置为可到达的最远位置
        {
            r = i + a[i];
            l = i + 1;
            for(int j = i + 1; j < n && j <= i+a[i]; ++j)
            {
                if(j+a[j] >= r) //遍历能到达的最远位置
                {
                    r = j + a[j]; //更新左右边界
                    l = j;
                }
            }
            i = l; //左边界
        }
        
        if(i < n - 1)
        {
            System.out.println("false");
        }
        else
        {
            System.out.println("true");
        }
    }
}

样例测试

样例一:

5
2 3 1 1 4
true

样例二:

5
3 2 1 0 4
false

跳跃游戏

标签:选择   整数   for   游戏   ann   ring   算法   贪心   tin   

原文地址:https://www.cnblogs.com/narisu/p/9057873.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!