秋游中的小力和小扣设计了一个追逐游戏。他们选了秋日市集景区中的 N 个景点,景点编号为 1~N。此外,他们还选择了 N 条小路,满足任意两个景点之间都可以通过小路互相到达,且不存在两条连接景点相同的小路。整个游戏场景可视作一个无向连通图,记作二维数组 edges,数组中以 [a,b] 形式表示景点 a 与景点 b 之间有一条小路连通。

小力和小扣只能沿景点间的小路移动。小力的目标是在最快时间内追到小扣,小扣的目标是尽可能延后被小力追到的时间。游戏开始前,两人分别站在两个不同的景点 startA 和 startB。每一回合,小力先行动,小扣观察到小力的行动后再行动。小力和小扣在每回合可选择以下行动之一:

移动至相邻景点
留在原地
如果小力追到小扣(即两人于某一时刻出现在同一位置),则游戏结束。若小力可以追到小扣,请返回最少需要多少回合;若小力无法追到小扣,请返回 -1。

注意:小力和小扣一定会采取最优移动策略。

示例 1:

输入:edges = [[1,2],[2,3],[3,4],[4,1],[2,5],[5,6]], startA = 3, startB = 5

输出:3

解释:

第一回合,小力移动至 2 号点,小扣观察到小力的行动后移动至 6 号点;
第二回合,小力移动至 5 号点,小扣无法移动,留在原地;
第三回合,小力移动至 6 号点,小力追到小扣。返回 3。

示例 2:

输入:edges = [[1,2],[2,3],[3,4],[4,1]], startA = 1, startB = 3

输出:-1

解释:

小力如果不动,则小扣也不动;否则小扣移动到小力的对角线位置。这样小力无法追到小扣。

提示:

edges 的长度等于图中节点个数
3 <= edges.length <= 10^5
1 <= edges[i][0], edges[i][1] <= edges.length 且 edges[i][0] != edges[i][1]
1 <= startA, startB <= edges.length 且 startA != startB

思路:在题解中发现了一个比较好的思路,一道非常值得回味的图论好题。

class Solution {private List<List<Integer>> e;public int chaseGame(int[][] edges, int startA, int startB) {int n = edges.length;int[] ingree = new int[n];e = new ArrayList<>();for (int i = 0; i < n; i++)e.add(new ArrayList<>());for (int i = 0; i < n; i++) {int u = edges[i][0] - 1;int v = edges[i][1] - 1;e.get(u).add(v);e.get(v).add(u);ingree[u]++;ingree[v]++;}int[] arr1 = new int[n];Arrays.fill(arr1, -1);--startA;bfs(arr1, startA);int[] arr2 = new int[n];Arrays.fill(arr2, -1);--startB;bfs(arr2, startB);int rest = n;Queue<Integer> q = new LinkedList<>();for (int i = 0; i < n; i++) {if (ingree[i] == 1)q.add(i);}//通过拓扑排序判断求出环的长度while (!q.isEmpty()) {int now = q.poll();--rest;for (int i = 0; i < e.get(now).size(); i++) {int nxt = e.get(now).get(i);ingree[nxt]--;if (ingree[nxt] == 1)q.add(nxt);}}int ans = 1;if (rest == 3) {for (int i = 0; i < n; i++) {if (arr1[i] > arr2[i] + 1)ans = Math.max(ans, arr1[i]);}} else {for (int i = 0; i < n; i++) {if (arr1[i] > arr2[i] + 1) {if (ingree[i] > 1) {ans = -1;break;} elseans = Math.max(ans, arr1[i]);}}}return ans;}private void bfs(int[] dis, int u) {Queue<Integer> q = new LinkedList<>();q.add(u);dis[u] = 0;while (!q.isEmpty()) {int now = q.poll();for (int i = 0; i < e.get(now).size(); i++) {int nxt = e.get(now).get(i);if (dis[nxt] == -1) {q.add(nxt);dis[nxt] = dis[now] + 1;}}}}
}

JAVA程序设计:追逐游戏(LCP 21)相关推荐

  1. java程序设计雷电游戏设计步骤_基于Java的飞机雷电射击游戏的设计任务书

    主要参考文献(资料): [1] Java 2游戏编程[M]. 清华大学出版社 , (美)ThomasPetchel著, 2005 [2] Java游戏引擎的开发与实现[J]. 何依林. 无线互联科技. ...

  2. java程序设计蜘蛛纸牌_蜘蛛纸牌java程序设计 小游戏设计 代码

    JA V A程序--小游戏设计:蜘蛛纸牌4 代码如下: import javax.swing.JMenuBar; import javax.swing.JMenu; import javax.swin ...

  3. 2021-2022学年度第二学期21级Java程序设计理论模拟考试

    说明:由于看pdf太难受了,重新编辑好放到博客上,方便自己复习,正确答案加粗标红 考试试卷 页码, 1/4 试卷名称:2021-2022学年度第二学期21级Java程序设计理论模拟考试(3.4.6班) ...

  4. java猜数字游戏课程设计报告_Java程序设计课程设计-猜数字游戏设计.doc

    Java程序设计课程设计-猜数字游戏设计.doc 还剩 23页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,喜欢就下载吧,价低环保! 内容要点: 课 程 设 计 报 告课程设计名称 Jav ...

  5. c语言猜拳游戏实训报告,Java猜拳小游戏程序设计实验报告.doc

    Java程序设计实验报告 班级: 学号: 姓名: 实验题目:猜拳小游戏 实验要求: 用java编写一个人机对战的猜拳小游戏.人选择性出拳,电脑随机出拳,判断输赢,记录输赢情况.有简单的操作界面. 实验 ...

  6. 北理工《Java程序设计》课程教学资源索引(2013版)——第21讲及Android第4讲发布

    北理工<Java程序设计> 课程教学资源索引(2013版,含<Android开发基础>) 说明: "Java程序设计"是北京理工大学计算机学院开设的选修课程 ...

  7. 专科java程序设计试卷_java程序设计试卷(含答案)

    ----------------密----------------封----------------线----------------- 年级: 层次: 专业: 学号: 姓名: 2015年春季学期 & ...

  8. 基于java的俄罗斯方块游戏系统设计与实现(项目报告+答辩PPT+源代码+数据库+截图+部署视频)

    基于Java的俄罗斯方块游戏的设计与实现 俄罗斯方块是一款风靡全球,从一开始到现在都一直经久不衰的电脑.手机.掌上游戏机产品,是一款游戏规则简单,但又不缺乏乐趣的简单经典小游戏,上手容易,适用范围广泛 ...

  9. 基于java的雷电游戏系统设计与实现(项目报告+答辩PPT+源代码+部署视频)

    项目报告 基于Java的雷电游戏 电脑游戏,是指在计算机上能够运转的游戏软件.这种软件具有较强的娱乐性.电脑游戏的创新和发展与硬件.软件的发展紧密相关.它能够给玩家提供一个虚拟的环境,使游戏带给了人们 ...

最新文章

  1. BI.寒号鸟请吃烧烤/意外入手“speed- dear friends vol.1”/入手“鲍家街43号”/我爱红红/我爱红红...
  2. 干货丨深度学习VGG模型核心拆解
  3. 基于OpenCV的膨胀和腐蚀
  4. C++学习成长的四个层次
  5. log_miner操作(日志挖掘)
  6. datatables 展开 折叠_更成熟的三星Z Fold2 折叠屏发展迈出关键一步
  7. python建立py文件夹过程_Pycharm创建python文件自动添加日期作者等信息(步骤详解)...
  8. 指纹特征点提取代码matlab代码,科学网—MATLAB特征提取代码 - 蒋样明的博文
  9. python pdf表格识别不出来_Python识别pdf表格
  10. 二级计算机vf题型,2010计算机等级考试二级VF考试题型与解题技巧
  11. 分布式之API接口返回格式如何优雅设计?,苦熬一个月
  12. 分享一个Ubuntu16.0.4安装MySQL5.7脚本
  13. “一键淘宝”将淘宝网店免费转移到手机客户端android教程
  14. dos攻击防范 php,DOS攻击和DDOS攻击的区别
  15. 笔记本电脑怎么拆开后盖_怎么拆解笔记本?新手拆解笔记本注意事项
  16. ckeditor java 取值_Jquery 对Ckeditor 取值
  17. 如何做好网站的安全性测试
  18. Amcharts4使用笔记
  19. 山东专升本计算机知识点(中)
  20. fragment添加失败错误查找

热门文章

  1. 苏州空天信息研究院前端一面
  2. 致迷茫的程序员一封信——我的程序生涯
  3. SmartGit使用
  4. 有没有2、3w前期适合一个人干的创业项目呢?做自媒体可以吗?
  5. [转]乔布斯的薄伽梵歌 Steve’s Bhagavat Gita
  6. hp dl160 gen8 b120i驱动与win2008r2忘记密码
  7. HHUOJ 1088 我们遇到什么困难也不要怕
  8. xxd命令-以十六进制形式表示
  9. vue/react高德地图选点组件(坐标拾取工具)
  10. 基于springboot2的开源OA办公系统