题目描述:

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

图的形式是:graph[a] 是一个列表,由满足 ab 是图中的一条边的所有节点 b 组成。

老鼠从节点 1 开始,第一个出发;猫从节点 2 开始,第二个出发。在节点 0 处有一个洞。

在每个玩家的行动中,他们 必须 沿着图中与所在当前位置连通的一条边移动。例如,如果老鼠在节点 1 ,那么它必须移动到 graph[1] 中的任一节点。

此外,猫无法移动到洞中(节点 0)。

然后,游戏在出现以下三种情形之一时结束:

如果猫和老鼠出现在同一个节点,猫获胜。
如果老鼠到达洞中,老鼠获胜。
如果某一位置重复出现(即,玩家的位置和移动顺序都与上一次行动相同),游戏平局。
给你一张图 graph ,并假设两位玩家都都以最佳状态参与游戏:

如果老鼠获胜,则返回 1;
如果猫获胜,则返回 2;
如果平局,则返回 0 。

样例:

方法一:

const int jerry_win = 1;
const int tom_win = 2;
const int draw = 0;
const int maxn = 51;class Solution {
public:int n;vector<vector<int>> graph;int dp[maxn][maxn][maxn * 2];int catMouseGame(vector<vector<int>>& graph) {this->graph = graph;n = graph.size();memset(dp, -1, sizeof(dp));return getresult(1, 2, 0);}int getresult(int jerry, int tom, int turns){//当轮数大于节点个数的两倍时,说明是平局if (turns == n * 2){return draw;}//如果该种状态还未出现过if (dp[jerry][tom][turns] < 0){//jerry跑进洞里时,jerry获胜if (jerry == 0){dp[jerry][tom][turns] = jerry_win;}//jerry和tom位于同一节点时,tom获胜else if (jerry == tom){dp[jerry][tom][turns] = tom_win;}else{getnextresult(jerry, tom, turns);}}return dp[jerry][tom][turns];}void getnextresult(int jerry, int tom, int turns){//当turns为偶数时当前是jerry的回合,反之是tom的回合int curmove = turns % 2 == 0 ? jerry : tom;//设置一个最差的结果,对jerry来说最差的结果就是tom获胜,反之亦然int worstresult = curmove == jerry ? tom_win : jerry_win;int result = worstresult;for (int next : graph[curmove]){//tom无法进到洞里if (curmove == tom && next == 0){continue;}//如果当前是jerry的回合,则next就是下一回合它的位置,否则下一回合它还在原地int nextjerry = curmove == jerry ? next : jerry;//如果当前是tom的回合,则next就是下一回合它的位置,否则下一回合它还在原地int nexttom = curmove == tom ? next : tom;int nextresult = getresult(nextjerry, nexttom, turns + 1);//如果走next后,最终结果不是失败,就更新resultif (nextresult != worstresult){result = nextresult;//如果最终结果不是失败也不是平局,当然就是获胜了,那么就走这条路if (result != draw){break;}}}//由于可以推出以后的状态中可以获胜、或平局、或失败,就用以后的状态更新当前的状态dp[jerry][tom][turns] = result;}
};

今天这题,实在太难了。。可以说就是看题解写的:力扣

2022.1.4 力扣-每日一题-猫和老鼠相关推荐

  1. 2022.1.28 力扣-每日一题-游戏中弱角色的数量

    题目描述: 你正在参加一个多角色游戏,每个角色都有两个主要属性:攻击 和 防御 .给你一个二维整数数组 properties ,其中 properties[i] = [attacki, defense ...

  2. 【JAVA】交错字符串——力扣每日一题(六)(2020.07.18)

    目录 题目:97. 交错字符串 思路 如果你从本文中学习到丝毫知识,那么请您点点关注.点赞.评论和收藏 大家好,我是爱做梦的鱼,我是东北大学大数据实验班大三的小菜鸡,非常渴望优秀,羡慕优秀的人,个人博 ...

  3. leetcode 力扣每日一题系列详解——总目录

    这是总目录,该系列持续更新中........ leetcode 力扣每日一题系列详解--总目录

  4. 【爬虫】力扣每日一题每天自动邮件提醒!!!

    使用python实现了一个力扣每日一题每天自动邮件提醒的小爬虫,小但实用!!! 文章目录 A.需求来源与分析 B.技术角度分析 C.具体分析步骤 1.接口协议分析 2.发邮件 3.写crontab放服 ...

  5. 力扣每日一题每天自动邮件提醒

    A.需求来源与分析 需求来源于生活,对于只是偶尔有兴趣做做题的我,力扣的每日一题对我一直有以下的不便: 太简单不想做,需要花太多时间的不想做,每天打开力扣其实只是想看一下是什么题,有意思才做. 看题需 ...

  6. 力扣每日一题:1720.解码异或后的数组 python异或操作

    1720.解码异或后的数组 https://leetcode-cn.com/problems/decode-xored-array/ 难度:简单 题目: 未知 整数数组 arr 由 n 个非负整数组成 ...

  7. LeetCode 力扣每日一题 488.祖玛游戏

    题目描述: 你正在参与祖玛游戏的一个变种. 在这个祖玛游戏变体中,桌面上有 一排 彩球,每个球的颜色可能是:红色 'R'.黄色 'Y'.蓝色 'B'.绿色 'G' 或白色 'W' .你的手中也有一些彩 ...

  8. 力扣每日一题 到达终点数字

    Day 37 Date: November 4, 2022 8:39 PM LinkedIn: https://leetcode.cn/problems/reach-a-number/descript ...

  9. 力扣每日一题——两数相加II

    发现做的题难度始终不高,今天Leecode给了一个稍微难一点的题目.(前两天没更是因为去拔牙了~~>_<~~) 给你两个 非空 链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每 ...

最新文章

  1. SAP Oracle EBS集成解决方案
  2. interrupt 1 using 1
  3. 科普篇 | 推荐系统之矩阵分解模型
  4. UVALive 6257 Chemist's vows --一道题的三种解法(模拟,DFS,DP)
  5. 蓝牙基础知识进阶——Physical channel
  6. 聚类实践(无监督学习)
  7. java 内存接口_java中多态机制的内存解析、抽象类、接口
  8. string list 查找_手撕java集合源码——List篇
  9. HDU3017:Lucas定理及详解
  10. 478.在圆内随机生成点
  11. js制作随机抽奖,(指定数字范围内随机出现一个数字)
  12. python调用海康人脸相机登录等接口(开发环境Linux)
  13. c语言与或非异或符号怎么打,逻辑运算符的符号
  14. java 设置图片大小_java 用这个方法如何设置图片大小
  15. 关于地理数据收集与处理的基本工具推荐(3)--最新30m的DEM与DSM数据免费下载
  16. windows10+Ubuntu双系统卸载旧Ubuntu并重装Ubuntu(绝对安全)
  17. 0ctf-2017-pwn-char 题解
  18. 【基于Centos】驱动安装
  19. 涨姿势 之 Sourcetree 显示头像
  20. 怎么把日程提醒放在手机桌面

热门文章

  1. 近两次C/C++面试题总结(福州新大陆、睿能科技,持续更新)
  2. WPS表格 对列数据进行随机排序
  3. edger多组差异性分析_转录组edgeR分析差异基因
  4. 微信公众号开发使用weui上传图片
  5. python简历怎么写开发_了解如何为Python开发人员制作简历
  6. detectron2使用自定义数据集及数据加载
  7. linux下怎么绑定arp,LINUX 下进行arp 绑定.doc
  8. AVAssetExportSession 视频转码
  9. 请问专利申请的流程和费用在哪儿可以找到?
  10. 2008浙江省百强企业名单