首页 > 试题广场 >

跳跃游戏

[编程题]跳跃游戏
  • 热度指数:1861 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定数组arr,arr[i]==k代表可以从位置向右跳1~k个距离。比如,arr[2]==3,代表可以从位置2跳到位置3、位置4或位置5。如果从位置0出发,返回最少跳几次能跳到arr最后的位置上。

输入描述:
输出包括两行,第一行一个整数n,代表arr数组长度,第二行n个整数代表数组arr[i]


输出描述:
输出一个整数,代表最少跳的次数。
示例1

输入

6
3 2 3 1 1 4

输出

2

说明

arr[0]==3,选择跳到位置2,arr[2]==3,可以跳到最后的位置。所以返回2。

备注:
时间复杂度O(n),额外空间复杂度O(1)
#include <bits/stdc++.h>
using namespace std;

int main(){
    int n, x, cnt=0, t=0, k=0;;
    scanf("%d", &n); 
    for(int i=0;i<n;i++){
        scanf("%d", &x);
        if(k<i){
            cnt++;
            k = t;
        }
        if(t < i+x)
            t = i+x;
    }
    printf("%d\n", cnt);
    return 0;
}

发表于 2020-04-21 00:41:32 回复(0)
贪心算法,从右往左尽可能多地回推,直至到达位置0
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        String[] strArr = br.readLine().trim().split(" ");
        int[] arr = new int[n];
        for(int i = 0; i < n; i++) arr[i] = Integer.parseInt(strArr[i]);
        System.out.println(recurrent(arr, n - 1));
    }
    
    private static int recurrent(int[] arr, int index) {
        if(index == 0) return 0;
        int start = index;
        // 将起点回退到能一步跳到index的最左点,以保证步数最少
        for(int i = 0; i < index; i++){
            if(index - i <= arr[i]){
                // 如果在i处可以一下跳到index处,就把起点往左推
                start = Math.min(start, i);
            }
        }
        return 1 + recurrent(arr, start);
    }
}

发表于 2021-11-21 19:41:38 回复(0)
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    vector<int>arr(n);
    for(int i=0;i<n;i++)
        cin>>arr[i];
    int jm = 0, cur = 0, next = 0;
    for(int i=0;i<n;i++)
    {
        if(cur<i){
            jm++;
            cur=next;
        }
        next=max(next,i+arr[i]);
    }
    cout<<jm<<endl;
    return 0;
}

发表于 2019-09-12 21:22:19 回复(0)
这是个入门题,表示有点挫败感
发表于 2022-03-10 17:17:30 回复(0)
import java.util.*;

public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int num = sc.nextInt();
            int[] arr = new int[num];
            for(int i=0;i<num;i++){
                arr[i] = sc.nextInt();
            }
            System.out.println(jump(arr));
        }
    public static int jump (int[] arr) {
        if (arr == null || arr.length == 0) {
            return 0;
    }
    int jump = 0;
    int cur = 0;
    int next = 0;
    for (int j=0;j < arr.length;j++) {
        if(cur < j) {
            jump++;
            cur = next;
        }
        next = Math.max(next, j + arr[j]);
    }
    return jump;
    }
}
发表于 2021-09-26 19:23:18 回复(0)
#输入数据
n=int(input())
number_list=list(map(int,input().split()))
#答案
ans=0
#新的跳跃步数
new_step=0
#新的当前所在位置
new_index=0
#列表长度
length=len(number_list)
#贪心思想,每次都跳跃最大步
#这样能保证总次数最少
for i in range(length):
    #如果新的当前所在位置
    #小于当前列表下标
    #证明还没有跳到最后位置
    #继续跳跃
    if new_index<i:
        ans+=1
        new_index=new_step
    #每次都选择最大的步数进行跳跃
    if new_step<i+number_list[i]:
        new_step=i+number_list[i]
print(ans)

发表于 2021-06-15 07:58:42 回复(0)
length = int(input())
nums = list(map(int, input().split()))
next_node, cur_node, res = 0, 0, 0
for i in range(length):
    if cur_node < i:
        res += 1
        cur_node = next_node
    next_node = max(next_node, i+nums[i])
print(res)

发表于 2020-11-09 09:51:31 回复(0)
// 虽然把这题放在入门级别, 但还是有点思维难度的
#include <iostream>
#include <vector>
using namespace std;

int main(){
    int n;
    cin>>n;
    vector<int>v(n);
    for(int i =0;i<n;++i){
        cin>>v[i];
    }
    // 记录当前记录
    int cur = 0;
    // 记录最远记录
    int furth = 0;
    // 记录跳跃步数
    int step = 0;
    for(int i = 0;i<n;++i){
        furth = max(furth,v[i]+i);
        if(furth >= n-1){
            cout<<step+1<<endl;
            break;
        }else if(i == cur){
            step +=1;
            cur = furth;
        }
    }
    
    return 0;
}

发表于 2020-07-15 16:50:46 回复(0)
从后往前推,用a[i]表示从位置i到最后的位置需要的最少步数。

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        if (n == 0) {
            System.out.println(0);
            return;
        }
        int[] a = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = sc.nextInt();
        }
        a[n - 1] = 0;
        for (int i = n - 2; i >= 0; i--) {
            int min = Integer.MAX_VALUE;
            for (int j = 1; j <= a[i] && i + j < n; j++) {
                min = Math.min(a[i + j], min);
            }
            a[i] = min + 1;
        }
        System.out.println(a[0]);
    }
}


发表于 2020-05-08 20:26:54 回复(0)
// 动态规划
import java.util.Scanner;
public class Main {
    public static void main(String[] args) throws Exception {
           Scanner in = new Scanner(System.in);
        int n = Integer.valueOf(in.nextLine().trim());
        int []array = new int[n];
        String data = in.nextLine();
        String[] s = data.split(" ");
        for (int i = 0; i < n; i++) {
            array[i] = Integer.valueOf(s[i]);
        }

        int []map = new int[n];
        for (int i = 0; i < n; i++) {
            for (int j = i+1; j<n && j <= i+array[i]; j++) {
                if (map[j] <= 0) {
                    map[j] = map[i]+1;
                } else {
                    map[j] = map[i]+1 < map[j] ? map[i]+1 : map[j];
                }
            }
        }
        System.out.println(map[n-1]);
        }
}

发表于 2020-03-22 16:57:19 回复(0)

import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
        int[] arr = new int[n];
        for(int i=0;i<n;i++){
            arr[i] = scanner.nextInt();
        }
        
        int jump = 0;
        int curr = 0;
        int border = 0;
        for(int i = 0;i<n;i++){
            if(curr < i){
                jump++;
                curr = border;
            }
            border = Math.max(border,i+arr[i]);
        }
        System.out.print(jump);
	}
}

发表于 2019-10-17 11:01:49 回复(0)
贪心算法,递归找能够到目标的最左边能到达目标点的位置
import java.io.*;
public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        int n=Integer.parseInt(br.readLine());
        if(n==0){
            System.out.println("输入错误");
            return;
        }
        String[] s=br.readLine().split(" ");
        int[] arr=new int[n];
        for(int i=0;i<n;++i){
            arr[i]=Integer.parseInt(s[i]);
        }
        int count=jump(arr,n-1);
        System.out.println(count);
    }
    public static int jump(int[] arr,int end){
        if(end==0)
            return 0;
        int left=end;
        for(int i=0;i<end;i++){
            if(end-i<=arr[i]){
                left=Math.min(i,left);
            }
        }
        return 1+jump(arr,left);
    }
}


发表于 2019-08-19 17:41:39 回复(0)