JAVA练习114-猫和老鼠
两位玩家分别扮演猫和老鼠,在一张 无向 图上进行游戏,两人轮流行动。
图的形式是:graph[a] 是一个列表,由满足 ab 是图中的一条边的所有节点 b 组成。
老鼠从节点 1 开始,第一个出发;猫从节点 2 开始,第二个出发。在节点 0 处有一个洞。
在每个玩家的行动中,他们 必须 沿着图中与所在当前位置连通的一条边移动。例如,如果老鼠在节点 1 ,那么它必须移动到 graph[1] 中的任一节点。
此外,猫无法移动到洞中(节点 0)。
然后,游戏在出现以下三种情形之一时结束:
- 如果猫和老鼠出现在同一个节点,猫获胜。
- 如果老鼠到达洞中,老鼠获胜。
- 如果某一位置重复出现(即,玩家的位置和移动顺序都与上一次行动相同),游戏平局。
给你一张图 graph ,并假设两位玩家都都以最佳状态参与游戏:
- 如果老鼠获胜,则返回 1;
- 如果猫获胜,则返回 2;
- 如果平局,则返回 0 。
示例 1:
输入:graph = [[2,5],[3],[0,4,5],[1,4,5],[2,3],[0,2,3]]
输出:0
示例 2:
输入:graph = [[1,3],[0],[3],[0,2]]
输出:1
提示:
- 3 <= graph.length <= 50
- 1 <= graph[i].length < graph.length
- 0 <= graph[i][j] < graph.length
- graph[i][j] != i
- graph[i] 互不相同
- 猫和老鼠在游戏中总是移动
分析:
方法:动态规划+dfs
考虑到猫和老鼠的状态和要走的步骤,而无向图的长度限制在 50 以内,那不妨用三个维度来表示状态,令当前状态为 F(i, j, k),i 表示走的步数,j 表示老鼠走的节点,k 表示猫走的节点,那当前状态满足以下条件:
- 当 i >= 无向图长度两倍时,表示猫和老鼠来一个路线来回走,平局,F(i, j, k) = 0
- 当 j = 0 时,老鼠进洞了,老鼠赢,F(i, j, k) = 1
- 当 j = k 时,猫和老鼠相遇了,猫赢,F(i, j, k) = 2
老鼠的优先级为:洞 > 平局 > 猫,猫的优先级为:不让老鼠进洞 > 抓老鼠 > 平局,我们可以采用深度优先遍历,按照优先级进行判断,因为老鼠先走,而我们从 0 开始,所以对步数进行取余,偶数为老鼠步,奇数为猫步。
时间复杂度:O(n^4)
空间复杂度:O(n^3)
class Solution {//无向图int[][] graph;//定义三维数组int[][][] arr;//定义节点数,最大为50int num = 50;public int catMouseGame(int[][] graph) {this.graph = graph;//定义三维数组arr = new int[num * 2][num][num];//遍历,数组默认为0,返回-1表示平局int res = dfs(0, 1, 2);return res == -1? 0: res;}public int dfs(int i, int j, int k){//重复遍历了一次,平局if(i == num * 2){return -1;}//老鼠进洞if(j == 0){arr[i][j][k] = 1;return 1;}//猫抓到老鼠if(j == k){arr[i][j][k] = 2;return 2;}//走过if(arr[i][j][k] != 0){return arr[i][j][k];}//老鼠步if(i % 2 == 0){//标识猫赢int cat = 2;//遍历路线for(int g: graph[j]){//下路状况int state = dfs(i+1, g, k);//有洞,进洞if(state == 1){arr[i][j][k] = 1;return 1;}//平局,猫赢不了if(state == -1){cat = -1;}}arr[i][j][k] = cat;return cat;}//猫步//标识老鼠赢int mouse = 1;//遍历路线for(int g: graph[k]){//老鼠洞,不进if(g == 0){continue;}//下路状况int state = dfs(i+1, j, g);//抓到老鼠if(state == 2){arr[i][j][k] = 2;return 2;}//平局,老鼠赢不了if(state == -1){mouse = -1;}}arr[i][j][k] = mouse;return mouse;}
}
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/cat-and-mouse
JAVA练习114-猫和老鼠相关推荐
- mybatis报错(三)报错Result Maps collection does not contain value for java.lang.Integer解决方法...
转自:https://blog.csdn.net/zengdeqing2012/article/details/50978682 1 [WARN ] 2016-03-25 13:03:23,955 - ...
- 最全最新的的Java核心知识点整理!!! 【推荐】
前言: 想要文档版的小伙伴们可以私信我领取哦,更加清晰 一目了然 ~ Java核心知识点! 博客整理出来的稍微有点乱~ 目录 目录 -1 JVM - 19 2.1. 线程 - 20 2.2. JVM ...
- Java面试大全(2020年版)101-200
目录 101. myBatis的缓存 102. myBatis实现一对一和一对多分别有几种方式,又都是怎么操作的呢 103. myBatis里面的动态Sql是怎么设定的?用什么语法? 104. myB ...
- 一脸懵逼学习Storm的搭建--(一个开源的分布式实时计算系统)
Storm的官方网址:http://storm.apache.org/index.html 1:集群部署的基本流程(基本套路):集群部署的流程:下载安装包.解压安装包.修改配置文件.分发安装包.启动集 ...
- Android环信爬坑指北(二)头像昵称好友备注显示
在上一篇文章中提到了要在初始化的时候,设置用户信息提供者类--EaseUserProfileProvider,用以获取用户信息.下面我们来看一下 EaseUserProfileProvider 是 ...
- 离线安装Cloudera Manager 5和CDH5(最新版5.9.3) 完全教程(七)界面安装
一.安装过程 1.1 登录 1.2 接受许可协议 1.3 选择免费版本 1.4 选择下一步 1.5 选择当前管理的主机 1.6 选择使用Parcel安装,选择CDH版本,点击继续 1.7 等待安装 此 ...
- 笔记72 高级SSM整合
遇到的问题: 1.进行spring mvc测试的时候报错 测试代码: 1 package com.li.test; 2 3 import com.github.pagehelper.PageInfo; ...
- android环信聊天界面上面显示昵称,【环信征文】在android中5分钟实现环信昵称头像的显示...
老司机带你们5分钟实现昵称头像的显示,车要开了,话不多说,快快上车~ 一.将简版demo里的cache包(5个java文件)复制到自己项目里. 下载环信android简版Demo: 环信Android ...
- 《STK基础教程》首发
2012年11月份左右开始着手写这本教程,2013年12月份左右最后一次更新,再到今天,2014年9月份,从刚开始写到现在已经过去两年时间.本来的想法是尽可能完善,尽量多翻译stk帮助文档,可能的话再 ...
- Android接入环信扩展消息显示头像、昵称
Android环信官方集成文档:http://docs.easemob.com/im/200androidclientintegration/10androidsdkimport 我在项目里集成环信时 ...
最新文章
- TPC性能测试及发布
- AntV的花瓣图中鼠标悬浮提示信息去掉与修改
- oracle学习笔记5:pl/sql流程控制语句
- python注册用户名和密码登录_python实现自动登录需要用户名和密码的网站
- java实现人脸识别V3版本开发
- 本地CDI限定词:@Any和@Default
- call stack and stack buffer overflow
- 苹果零售店每平方英尺能创造4000美元
- php yat grpc,PHP GRPC 模块安装配置-Go语言中文社区
- 【Win10系统自带软件】文件系统错误(-2147219196)解决方法
- CVPR 2021 | 港科大:如何利用闪光图像(flash image)来去除反光?
- python unicode error_python-ValueError:操作参数必须为str或unicode
- 如何提高网站关键词排名和增加收录量
- 武汉计算机学院 曹建文,实验室与设备管理处
- CentOS 7虚拟机克隆,以及克隆后主机名和静态IP地址的修改,无法重启网络服务( because the control process exited with error code)的解决方法
- WordPress插件推荐,WordPress插件推荐和使用
- day15_雷神_前端03
- head标签中logo图的设置
- 南京信息工程大学计算机专业分流,2018级电子信息类专业分流工作实施细则
- c语言 周期性矩形脉冲,模拟电子技术讲义