两位玩家分别扮演猫和老鼠,在一张 无向 图上进行游戏,两人轮流行动。

图的形式是: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 表示猫走的节点,那当前状态满足以下条件:

  1. 当 i >= 无向图长度两倍时,表示猫和老鼠来一个路线来回走,平局,F(i, j, k) = 0
  2. 当 j = 0 时,老鼠进洞了,老鼠赢,F(i, j, k) = 1
  3. 当 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-猫和老鼠相关推荐

  1. 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 - ...

  2. 最全最新的的Java核心知识点整理!!! 【推荐】

    前言: 想要文档版的小伙伴们可以私信我领取哦,更加清晰 一目了然 ~ Java核心知识点! 博客整理出来的稍微有点乱~ 目录 目录 -1 JVM - 19 2.1. 线程 - 20 2.2. JVM ...

  3. Java面试大全(2020年版)101-200

    目录 101. myBatis的缓存 102. myBatis实现一对一和一对多分别有几种方式,又都是怎么操作的呢 103. myBatis里面的动态Sql是怎么设定的?用什么语法? 104. myB ...

  4. 一脸懵逼学习Storm的搭建--(一个开源的分布式实时计算系统)

    Storm的官方网址:http://storm.apache.org/index.html 1:集群部署的基本流程(基本套路):集群部署的流程:下载安装包.解压安装包.修改配置文件.分发安装包.启动集 ...

  5. Android环信爬坑指北(二)头像昵称好友备注显示

      在上一篇文章中提到了要在初始化的时候,设置用户信息提供者类--EaseUserProfileProvider,用以获取用户信息.下面我们来看一下 EaseUserProfileProvider 是 ...

  6. 离线安装Cloudera Manager 5和CDH5(最新版5.9.3) 完全教程(七)界面安装

    一.安装过程 1.1 登录 1.2 接受许可协议 1.3 选择免费版本 1.4 选择下一步 1.5 选择当前管理的主机 1.6 选择使用Parcel安装,选择CDH版本,点击继续 1.7 等待安装 此 ...

  7. 笔记72 高级SSM整合

    遇到的问题: 1.进行spring mvc测试的时候报错 测试代码: 1 package com.li.test; 2 3 import com.github.pagehelper.PageInfo; ...

  8. android环信聊天界面上面显示昵称,【环信征文】在android中5分钟实现环信昵称头像的显示...

    老司机带你们5分钟实现昵称头像的显示,车要开了,话不多说,快快上车~ 一.将简版demo里的cache包(5个java文件)复制到自己项目里. 下载环信android简版Demo: 环信Android ...

  9. 《STK基础教程》首发

    2012年11月份左右开始着手写这本教程,2013年12月份左右最后一次更新,再到今天,2014年9月份,从刚开始写到现在已经过去两年时间.本来的想法是尽可能完善,尽量多翻译stk帮助文档,可能的话再 ...

  10. Android接入环信扩展消息显示头像、昵称

    Android环信官方集成文档:http://docs.easemob.com/im/200androidclientintegration/10androidsdkimport 我在项目里集成环信时 ...

最新文章

  1. TPC性能测试及发布
  2. AntV的花瓣图中鼠标悬浮提示信息去掉与修改
  3. oracle学习笔记5:pl/sql流程控制语句
  4. python注册用户名和密码登录_python实现自动登录需要用户名和密码的网站
  5. java实现人脸识别V3版本开发
  6. 本地CDI限定词:@Any和@Default
  7. call stack and stack buffer overflow
  8. 苹果零售店每平方英尺能创造4000美元
  9. php yat grpc,PHP GRPC 模块安装配置-Go语言中文社区
  10. 【Win10系统自带软件】文件系统错误(-2147219196)解决方法
  11. CVPR 2021 | 港科大:如何利用闪光图像(flash image)来去除反光?
  12. python unicode error_python-ValueError:操作参数必须为str或unicode
  13. 如何提高网站关键词排名和增加收录量
  14. 武汉计算机学院 曹建文,实验室与设备管理处
  15. CentOS 7虚拟机克隆,以及克隆后主机名和静态IP地址的修改,无法重启网络服务( because the control process exited with error code)的解决方法
  16. WordPress插件推荐,WordPress插件推荐和使用
  17. day15_雷神_前端03
  18. head标签中logo图的设置
  19. 南京信息工程大学计算机专业分流,2018级电子信息类专业分流工作实施细则
  20. c语言 周期性矩形脉冲,模拟电子技术讲义

热门文章

  1. CentOS 7 分区方案
  2. iPhone闯大祸!车祸检测大量误报挤占救援资源
  3. 【第一篇】学习与奋斗,不努力就会与社会脱节
  4. 关于对大一上学期的学习总结及大一下学期的规划。
  5. CryptoJS 加密的使用方法
  6. APP上运行小程序的混合移动研发模式
  7. 一些象素画、图标的网站收集
  8. 算法笔记 (四)算法的逻辑结构和物理结构
  9. 【HTTP】989- HTTP 传输大文件的几种方案
  10. html测试题英语,北大PKU-GATE考试真题-题库