题目详情

标题:跳格子游戏 | 时间限制:1秒 | 内存限制:262144K | 语言限制:不限

地上共有N个格子,你需要跳完地上所有的格子,但是格子间是有强依赖关系的,跳完前一个格子后,后续的格子才会被开启,格子间的依赖关系由多组steps数组给出,steps[0]表示前一个格子,steps[1]表示steps[0]可以开启的格子:

比如[0,1]表示从跳完第0个格子以后第1个格子就开启了,比如[2,1],[2,3]表示跳完第2个格子后第1个格子和第3个格子就被开启了

请你计算是否能由给出的steps数组跳完所有的格子,如果可以输出yes,否则输出no

说明

1.你可以从一个格子跳到任意一个开启的格子

2.没有前置依赖条件的格子默认就是开启的

3.如果总数是N,则所有的格子编号为[0,1,2,3…N-1]连续的数组

输入描述:

输入一个整数N表示总共有多少个格子,接着输入多组二维数组steps表示所有格子之间的依赖关系

输出描述:

如果能按照steps给定的依赖顺序跳完所有的格子输出yes

否则输出no

示例1

输入

3

0 1

0 2

输出

yes

说明

总共有三个格子[0,1,2],跳完0个格子后第1个格子就开启了,跳到第0个格子后第2个格子也被开启了,按照0->1->2或者0->2->1的顺序都可以跳完所有的格子

示例2

输入

2

1 0

0 1

输出

no

说明

总共有2个格子,第1个格子可以开启第0格子,但是第1个格子又需要第0个格子才能开启,相互依赖,因此无法完成

示例3

输入

6

0 1

0 2

0 3

0 4

0 5

输出

yes

说明

总共有6个格子,第0个格子可以开启第1,2,3,4,5个格子,所以跳完第0个格子之后其他格子都被开启了,之后按任何顺序可以跳完剩余的格子

示例4

输入

5

4 3

0 4

2 1

3 2

输出

yes

说明

跳完第0个格子可以开启格子4,跳完格子4可以开启格子3,跳完格子3可以开启格子2,跳完格子2可以开启格子1,按照0->4->3->2->1这样就跳完所有的格子

示例5

输入

4

1 2

1 0

输出

yes

说明

总共4个格子[0,1,2,3],格子1和格子3没有前置条件所以默认开启,格子1可以开启格子0和格子2,所以跳到格子1之后就可以开启所有的格子,因此可以跳完所有格子

解题思路

很明显这是一道拓扑排序题目,不同的节点之间存在先后执行依赖关系,只有前一个节点完成后一个节点才能完成。比如以下面例子

6

1 2
1 3
1 4
0 2
0 3
3 1

为例子,有拓扑图如下所示:

edges是一个长度N为的List集合,以steps格子的右边数据(即开启的格子)为索引,以依赖关系的左边数据作为list的相邻顶点集合。节点5是一个单独节点。

可以使用深度搜索或者广度搜索来遍历图中的每个节点以及其相邻节点,如果判断图中存在环,那么一定有两个格子相互依赖,也就无法跳完所有的格子。以深度搜索dfs为例说明,如何判别图中是否存在环呢?针对某个节点来说,遍历其有三种可能:

  • 这个节点还未被遍历过,这种情况会将这个节点加入dfs里面递归遍历,直到某节点再无相邻节点就结束。图中0节点还没被遍历过,将节点0加入到dfs方法里面一直遍历到节点4,节点4再无相邻节点,符合条件。

  • 这个节点已经被遍历过了,但是在遍历其相邻节点时又遍历了一次这个节点。比如节点0进入dfs深度遍历,先是遍历0的相邻节点3,再遍历相邻节点1,接下来再次遍历节点1的相邻节点时是节点3而不是节点4,此时发现节点3已经被遍历过了,那么图中一定存在环,跳格子失败。

  • 这个节点被遍历过了而且相邻节点也被深度遍历过了,说明图中无环(单独一个节点必然没有环),可以跳完所有的格子。

想要对一个节点标记3中遍历状态,那么使用boolean数组是欠妥的,可以使用int数组,用整数0,1, 2表示一个节点的不同的遍历状态。

Java代码

public class Main {private static final int NOT_VISITED = 0;private static final int VISITED = 1;private static final int VISIT_FINISHED = 2;static int[] visitStatus;                          //节点遍历状态static List<List<Integer>> edges;                     //记录每个节点的相邻节点static boolean stepAllGrids;                      //是否能跳完所有格子的结果判断public static boolean step(int N,List<List<Integer>> edges) {visitStatus = new int[N];     //节点默认为0 ~ N - 1for(int i = 0; i < N && stepAllGrids; i++) {   //总是从节点0开始进入if(visitStatus[i] == NOT_VISITED) {dfs(i);}}return stepAllGrids;}public static void dfs(int node) {visitStatus[node] = VISITED;for(int neighbor : edges.get(node)) {        //遍历相邻节点if(visitStatus[neighbor] == NOT_VISITED) {dfs(neighbor);if(!stepAllGrids) {  //如果退出循环时检测到环,直接退出return;}}else if(visitStatus[neighbor] == VISITED){   //再一次遍历到此节点,说明存在环,无法完成拓扑排序stepAllGrids = false;return;}}visitStatus[node] = VISIT_FINISHED;}public static void main(String[] args) {Scanner sc = new Scanner(System.in);while(sc.hasNextLine()) {int N = sc.nextInt();if(N < 1 || N >= 500) {System.out.println("error:输入的格子个数应该大于等于1且小于500");return;}edges = new ArrayList<>();for(int i = 0; i < N; i++) {     //默认节点在0 ~ N - 1之间edges.add(new ArrayList<>());}stepAllGrids = true;while(sc.hasNext()) {int a = sc.nextInt();if(a == -1) {            //题目缺失输入退出条件,不妨设置输入-1就退出输入break;}String line = sc.nextLine();String[] strs = line.split(" ");if(strs.length != 2) {System.out.println("error:输入的格子数组列数不为2");return;}if(a < 0 || a >= N) {System.out.println("error:输入的左侧格子号码应该大于等于0且小于" + N);return;}int b = Integer.parseInt(strs[1]);if(b < 0 || b >= N) {System.out.println("error:输入的右侧格子号码应该大于等于0且小于" + N);return;}edges.get(b).add(a);}if(step(N, edges)) {System.out.println("yes");}else {System.out.println("no");}}}
}

笔试题-跳格子游戏,Java代码相关推荐

  1. 网易2017招聘笔试题下厨房Java代码

    本文地址:http://blog.csdn.net/shanglianlm/article/details/77839651 牛牛想尝试一些新的料理,每个料理需要一些不同的材料,问完成所有的料理需要准 ...

  2. 京东2016招聘笔试题分苹果Java代码

    本文地址:http://blog.csdn.net/shanglianlm/article/details/77839621 题目描述 果园里有一堆苹果,一共n头(n大于1小于9)熊来分,第一头为小东 ...

  3. 五子棋游戏Java代码简单实现(含活动图和类图设计)

    五子棋游戏Java代码简单实现(含活动图和类图设计) 文章目录 五子棋游戏Java代码简单实现(含活动图和类图设计) 活动图设计 类图设计 代码实现 总结 OOA和OOD设计 代码设计 可改进部分 活 ...

  4. Java 面试/笔试题神整理 [Java web and android]

    Java 面试/笔试题神整理 一.Java web 相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并 ...

  5. 2017年java笔试题_初级java程序员笔试题

    Java认证考试是业界唯一经Sun授权的Java认证,考试内容涉及所有Java相关知识.编程概念及applet开发技巧.下面是小编整理的关于java初级程序员面试题,欢迎大家参考! 一:判断题 1.J ...

  6. 中科曙光Java笔试题_中科金财Java开发工程师笔试题的(带答案).docx

    中科金财Java开发工程师笔试题的(带答案) Java开发工程师笔试试题(请不要在试题上留任何痕迹,所有答案均写在答题纸上)编程题(共26分)任意写出一种排序算法.(6分)public void so ...

  7. java字符串笔试题_五道Java常见笔试题及答案汇总

    1.String和StringBuffer的区别? 答:Java平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据.这个String类提供了数 ...

  8. java猜拳游戏代码_猜拳游戏 - java代码库 - 云代码

    [java]代码库public class Computer { String name; int score; public int showfist(){ int quan; quan=(int) ...

  9. 华为2017java笔试题_华为Java笔试题

    今天给大家分享的是一套关于华为Java类的笔试题,相信计算机专业的朋友对这些题会很感兴趣. 1.IP地址的编码分为哪俩部分? IP地址由两部分组成,网络号和主机号.不过是要和"子网掩码&qu ...

最新文章

  1. 大数据分布式集群搭建(4)
  2. Spring boot拦截器登录检查
  3. mongodb笔记(三)
  4. 全选按钮的使用。winfrom程序中,对全选按钮的理解,欢迎拍砖!
  5. 计算机网络学习笔记-1.1.3-速率相关的性能指标
  6. 安装mongodb时为什么一直卡着不动
  7. 禁用计算机服务LanmanServer,[如何]在Windows 10中启用或禁用SMB协议 | MOS86
  8. 读书笔记 - js高级程序设计 - 第四章 变量 作用域 和 内存问题
  9. struts框架搭建及validator示例
  10. 明年,移动应用开发将出现这八大趋势
  11. pulse 去马赛克软件_打马赛克就安全了吗?AI消除马赛克,上线三天收获近7000星...
  12. VISTA组策略中关闭自动播放的位置
  13. 台式计算机有哪些部分组成,常用台式电脑的基本组成
  14. 不得不说说微信钉钉后端亿级用户架构那些事
  15. 华为服务器显示灯p02,华为服务器uid灯蓝色
  16. PHP随机生成英文大小写
  17. Virtex—5 GTP和Virtex—6 GTX间匹配通信研究及应用
  18. 文件上传漏洞之——远程文件包含漏洞(RFI)
  19. 蓝牙耳机ENC通话降噪测试-自适应滤波技术
  20. MAG中关于数组和COMBO,LIST的联合使用例子(MAGList和MAGInputList)

热门文章

  1. 【算法竞赛学习笔记】状压DP
  2. Xilinx HLx 2017.1 与VS 2017兼容问题解决
  3. 电子商务系统的运维与评价(十三)
  4. 网络舆情源头管理方案
  5. 计算机毕业设计ssm工作室管理系统v186g系统+程序+源码+lw+远程部署
  6. 为什么iPhone手机微信信息老是出现延误?原来是这5大原因搞的鬼
  7. mw320r虚拟服务器,新版水星MW320R路由器设置教程 | 192路由网
  8. 【企业架构设计实战】应用架构设计
  9. 解决eclipse出现This Android SDK requires Andro...date ADT to the latest version.问题
  10. 用DOCKER安装及使用SSCHA