JAVA程序设计:追逐游戏(LCP 21)
秋游中的小力和小扣设计了一个追逐游戏。他们选了秋日市集景区中的 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)相关推荐
- java程序设计雷电游戏设计步骤_基于Java的飞机雷电射击游戏的设计任务书
主要参考文献(资料): [1] Java 2游戏编程[M]. 清华大学出版社 , (美)ThomasPetchel著, 2005 [2] Java游戏引擎的开发与实现[J]. 何依林. 无线互联科技. ...
- java程序设计蜘蛛纸牌_蜘蛛纸牌java程序设计 小游戏设计 代码
JA V A程序--小游戏设计:蜘蛛纸牌4 代码如下: import javax.swing.JMenuBar; import javax.swing.JMenu; import javax.swin ...
- 2021-2022学年度第二学期21级Java程序设计理论模拟考试
说明:由于看pdf太难受了,重新编辑好放到博客上,方便自己复习,正确答案加粗标红 考试试卷 页码, 1/4 试卷名称:2021-2022学年度第二学期21级Java程序设计理论模拟考试(3.4.6班) ...
- java猜数字游戏课程设计报告_Java程序设计课程设计-猜数字游戏设计.doc
Java程序设计课程设计-猜数字游戏设计.doc 还剩 23页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,喜欢就下载吧,价低环保! 内容要点: 课 程 设 计 报 告课程设计名称 Jav ...
- c语言猜拳游戏实训报告,Java猜拳小游戏程序设计实验报告.doc
Java程序设计实验报告 班级: 学号: 姓名: 实验题目:猜拳小游戏 实验要求: 用java编写一个人机对战的猜拳小游戏.人选择性出拳,电脑随机出拳,判断输赢,记录输赢情况.有简单的操作界面. 实验 ...
- 北理工《Java程序设计》课程教学资源索引(2013版)——第21讲及Android第4讲发布
北理工<Java程序设计> 课程教学资源索引(2013版,含<Android开发基础>) 说明: "Java程序设计"是北京理工大学计算机学院开设的选修课程 ...
- 专科java程序设计试卷_java程序设计试卷(含答案)
----------------密----------------封----------------线----------------- 年级: 层次: 专业: 学号: 姓名: 2015年春季学期 & ...
- 基于java的俄罗斯方块游戏系统设计与实现(项目报告+答辩PPT+源代码+数据库+截图+部署视频)
基于Java的俄罗斯方块游戏的设计与实现 俄罗斯方块是一款风靡全球,从一开始到现在都一直经久不衰的电脑.手机.掌上游戏机产品,是一款游戏规则简单,但又不缺乏乐趣的简单经典小游戏,上手容易,适用范围广泛 ...
- 基于java的雷电游戏系统设计与实现(项目报告+答辩PPT+源代码+部署视频)
项目报告 基于Java的雷电游戏 电脑游戏,是指在计算机上能够运转的游戏软件.这种软件具有较强的娱乐性.电脑游戏的创新和发展与硬件.软件的发展紧密相关.它能够给玩家提供一个虚拟的环境,使游戏带给了人们 ...
最新文章
- BI.寒号鸟请吃烧烤/意外入手“speed- dear friends vol.1”/入手“鲍家街43号”/我爱红红/我爱红红...
- 干货丨深度学习VGG模型核心拆解
- 基于OpenCV的膨胀和腐蚀
- C++学习成长的四个层次
- log_miner操作(日志挖掘)
- datatables 展开 折叠_更成熟的三星Z Fold2 折叠屏发展迈出关键一步
- python建立py文件夹过程_Pycharm创建python文件自动添加日期作者等信息(步骤详解)...
- 指纹特征点提取代码matlab代码,科学网—MATLAB特征提取代码 - 蒋样明的博文
- python pdf表格识别不出来_Python识别pdf表格
- 二级计算机vf题型,2010计算机等级考试二级VF考试题型与解题技巧
- 分布式之API接口返回格式如何优雅设计?,苦熬一个月
- 分享一个Ubuntu16.0.4安装MySQL5.7脚本
- “一键淘宝”将淘宝网店免费转移到手机客户端android教程
- dos攻击防范 php,DOS攻击和DDOS攻击的区别
- 笔记本电脑怎么拆开后盖_怎么拆解笔记本?新手拆解笔记本注意事项
- ckeditor java 取值_Jquery 对Ckeditor 取值
- 如何做好网站的安全性测试
- Amcharts4使用笔记
- 山东专升本计算机知识点(中)
- fragment添加失败错误查找