跳跃游戏

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

跳跃游戏
给定一个非负整数数组,假定你的初始位置为数组第一个下标。
数组中的每个元素代表你在那个位置能够跳跃的最大长度。
请确认你是否能够跳跃到数组的最后一个下标。
例如:A=[2,3,1,1,4]能够跳跃到最后一个下标,输出true;
A=[3,2,1,0,4]不能跳跃到最后一个下标,输出false。
输入格式
第一行输入一个正整数 n(1≤n≤500),接下来的一行 n个整数,输入数组 A。
输出格式
如果能跳到最后一个下标,输出true,否则输出false。
样例输入
5
2 0 2 0 1
样例输出
true

题目链接:https://nanti.jisuanke.com/t/18

解析:http://blog.csdn.net/u014453894/article/details/46902221

法一:
采用遍历的思想,递归调用,时间复杂度高,不可取。主要是从第一个数组开始,进行所有路径的遍历,当遍历到最大跳跃长度为0并且不是最后一个结点时即结束此路径的遍历。

 1 import java.util.Scanner;
 2 class Main {
 3     public static boolean re=false;
 4     public static int flag=1;
 5     public static void main(String args[]){
 6         int count,i;
 7         Scanner stdin = new Scanner(System.in);  
 8         count=stdin.nextInt();
 9         int []a=new int[1000];
10         for(i=0;i<count;i++)
11         {
12             a[i]=stdin.nextInt();
13         }
14         find(0,a[0],count,a);
15         System.out.print(re);
16         
17     }
18     public static void find(int index,int len,int count,int []a)
19     {
20         if(index==count-1)
21         {
22             re=true;
23             return;
24         }
25         if(true)
26         {
27             if(len==0)
28             {
29                 return;
30             }
31             for(int i=1;i<=len&&i<count-index;i++)
32             {
33                 find(index+i,a[index+i],count,a);
34             }
35         }
36     }
37 }
View Code

法二:
同样采用遍历的思想,递归调用,时间复杂度高,不可取。与法一差不多,只是从后往前遍历。

 1 import java.util.Scanner;
 2 public class Main2 {
 3     public static boolean re=false;
 4     public static void main(String args[]){
 5         int count,i;
 6         Scanner stdin = new Scanner(System.in);  
 7         count=stdin.nextInt();
 8         int []a=new int[1000];
 9         for(i=0;i<count;i++)
10         {
11             a[i]=stdin.nextInt();
12         }
13         System.out.println(can(count-1,a,count));
14     }
15     public static boolean can(int index,int []a,int count)
16     {
17         boolean haha;
18         if(index==0)
19             return true;
20         for(int i=1;i<=index;i++)
21         {
22             if(a[index-i]>=i)
23             {
24                 haha=can(index-i,a,count);
25                 if(haha==true)
26                     return true;
27             }
28 
29         }
30         return false;
31     }
32 
33 }
View Code

法三:
贪心算法,时间复杂度低,可取。主要思想就是从第一个数组元素开始计算此数组元素所能到达的最远的数据元素下标,如果后面有更远的则替换max值,但如果出现下标值比能达到的最远元素max的值还大的数组元素,说明此元素不可达到,那么最后一个元素更不可达到,就返回“false”,否则返回“true”。

 1 import java.util.Scanner;
 2 public class Main3 {
 3     public static void main(String[] args) {
 4         // TODO Auto-generated method stub
 5         int count,i,max=0;
 6         Scanner stdin = new Scanner(System.in);  
 7         count=stdin.nextInt();
 8         int []a=new int[1000];
 9         for(i=0;i<count;i++)
10         {
11             a[i]=stdin.nextInt();
12         }
13         for(i=0;i<count;i++)
14         {
15             if(i>max)
16             {
17                 System.out.println("false");
18                 return;
19             }
20             if(i+a[i]>max)
21                 max=i+a[i];
22         }
23         System.out.println("true");
24     }
25 
26 }
View Code

法四:

主要思想是对数组中0值的判断,如果数组中所有0值的数组元素可以被前面的数组元素跳过,则为“true”,如果数组中有一个0值使得数组元素不能被跳过即为必经的数组元素,则为“false”。

 1 #include <stdio.h>
 2 int main(int argc, char *argv[])
 3 {
 4     int n,a[505],i,k,f;
 5     scanf("%d",&n);
 6     for(i=0;i<n;i++)
 7         scanf("%d",&a[i]);
 8     if(n==1) printf("true\n");
 9     else if(a[0]==0) printf("false\n");
10     else
11     {
12         n--;//最后一个元素是不需要检验的
13         for(i=1;i<n;i++)
14         {
15             if(a[i]==0)//检验a[1]~a[n-2]之间所有值为0的元素
16             {
17                 f=0;
18                 for(k=i-1;k>=0;k--)//对每一个等于0的a[i],检验该a[i]是否是一个不可跨越点(不可跨越点是指:从a[0]~a[i-1]出发,不管如何跳,最终都无法跨过这个a[i]这个点。)
19                 {
20                     if(k+a[k]>i){ f=1; break; }//因为a[k+1]~a[i-1]都无法跨越a[i]点,所以当k+a[k]<=i时,即使a[k]想要借助中间点起跳之后再跨越a[i]也是不可能的.
21                 }
22                 if(f==0)//f==0说明a[0]~a[i-1]都无法跨越a[i]点,那么a[i]就是无法跨越的点,也即:所有点都会落在a[i]这个点上面。然后又因为a[i]==0,所以其他点落在a[i]后会停止继续跳跃,最终无法到达终点。
23                 {
24                     printf("false\n");
25                     return 0;
26                 }
27             }
28         }
29         printf("true\n");
30     }
31     return 0;
32 }

 

相关文章
|
存储 网络协议 Ubuntu
【C++网络编程】Socket基础:网络通讯程序入门级教程
【C++网络编程】Socket基础:网络通讯程序入门级教程
379 7
|
网络安全
idea配置远程服务器实现远程编辑文件及ssh连接
idea配置远程服务器实现远程编辑文件及ssh连接
476 0
|
机器学习/深度学习 传感器 人工智能
首篇!最全的全景分割综述(RGB图像/医学图像/LiDAR)(下)
本文对现有的全景分割方法进行了第一次全面的综述。因此,基于所采用的算法、应用场景和主要目标的性质,对现有全景技术进行了定义良好的分类。此外,还讨论了全景分割在通过伪标记标注新数据集中的应用。接下来,进行消融研究,以从不同角度了解全景方法。此外,还讨论了适用于全景分割的评估指标,并对现有解决方案的性能进行了比较,以了解最新技术并确定其局限性和优势。最后,阐述了当前主题技术面临的挑战以及近期吸引大量关注的未来趋势,这可以作为未来研究的起点。
首篇!最全的全景分割综述(RGB图像/医学图像/LiDAR)(下)
|
8月前
|
机器学习/深度学习 计算机视觉
RT-DETR改进策略【注意力机制篇】| ICLR2023 高效计算与全局局部信息融合的 Sea_Attention 模块(含HGBlock二次创新)
RT-DETR改进策略【注意力机制篇】| ICLR2023 高效计算与全局局部信息融合的 Sea_Attention 模块(含HGBlock二次创新)
200 2
RT-DETR改进策略【注意力机制篇】| ICLR2023 高效计算与全局局部信息融合的 Sea_Attention 模块(含HGBlock二次创新)
|
9月前
|
人工智能 测试技术
VideoPhy:UCLA 和谷歌联合推出评估视频生成模型物理模拟能力的评估工具,衡量模型生成的视频是否遵循现实世界的物理规则
VideoPhy 是 UCLA 和谷歌联合推出的首个评估视频生成模型物理常识能力的基准测试,旨在衡量模型生成的视频是否遵循现实世界的物理规则。
219 9
VideoPhy:UCLA 和谷歌联合推出评估视频生成模型物理模拟能力的评估工具,衡量模型生成的视频是否遵循现实世界的物理规则
|
9月前
|
人工智能 IDE 程序员
从 AI Coding 演进路径看通义灵码 AI 程序员的发布,让更多 idea 变成产品
通义灵码 2.0 不仅正式发布 AI 程序员,还升级了很多基础能力,使用场景多样。繁星计划的推出更为大学生提供了免费的智能编码助手,助力科技创新。让不具备编码能力的人也可以将 idea 变成产品,帮助到更多开发者和泛开发者。
|
10月前
|
机器学习/深度学习 数据采集 DataWorks
DataWorks产品评测:数据处理与分析的最佳实践
DataWorks是阿里巴巴推出的大数据开发治理平台,支持从数据采集、预处理、存储到分析的全流程操作。本文评测了其在用户画像分析中的应用,包括数据收集、清洗、特征工程、模型训练、结果评估及应用部署等步骤,展示了其在提高数据资产管理效率、支持多种编程语言和技术栈、集成丰富可视化工具等方面的优势。同时,文章也指出了DataWorks在使用过程中的一些不便与问题,并提出了改进建议。
281 17
|
12月前
|
编解码 监控 API
直播源怎么调用api接口
调用直播源的API接口涉及开通服务、添加域名、获取API密钥、调用API接口、生成推流和拉流地址、配置直播源、开始直播、监控管理及停止直播等步骤。不同云服务平台的具体操作略有差异,但整体流程简单易懂。
|
Prometheus 监控 Cloud Native
实时计算 Flink版产品使用问题之怎么关闭HDFS的Web界面
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
12月前
|
安全 网络安全 网络虚拟化
Cisco-三层交换机实现VLAN间路由
Cisco-三层交换机实现VLAN间路由
224 0