题目描述:

一只猫和一只老鼠在玩一个叫做猫和老鼠的游戏。

它们所处的环境设定是一个 rows x cols 的方格 grid ,其中每个格子可能是一堵墙、一块地板、一位玩家(猫或者老鼠)或者食物。

玩家由字符 'C' (代表猫)和 'M' (代表老鼠)表示。
        地板由字符 '.' 表示,玩家可以通过这个格子。
        墙用字符 '#' 表示,玩家不能通过这个格子。
        食物用字符 'F' 表示,玩家可以通过这个格子。
        字符 'C' , 'M' 和 'F' 在 grid 中都只会出现一次。

猫和老鼠按照如下规则移动:

老鼠 先移动 ,然后两名玩家轮流移动。
        每一次操作时,猫和老鼠可以跳到上下左右四个方向之一的格子,他们不能跳过墙也不能跳 出 grid 。
        catJump 和 mouseJump 是猫和老鼠分别跳一次能到达的最远距离,它们也可以跳小于最大距离的长度。
        它们可以停留在原地。
        老鼠可以跳跃过猫的位置。

游戏有 4 种方式会结束:

如果猫跟老鼠处在相同的位置,那么猫获胜。
        如果猫先到达食物,那么猫获胜。
        如果老鼠先到达食物,那么老鼠获胜。
        如果老鼠不能在 1000 次操作以内到达食物,那么猫获胜。
给你 rows x cols 的矩阵 grid 和两个整数 catJump 和 mouseJump ,双方都采取最优策略,如果老鼠获胜,那么请你返回 true ,否则返回 false 。

示例 1:

输入:grid = ["####F","#C...","M...."], catJump = 1, mouseJump = 2
输出:true
解释:猫无法抓到老鼠,也没法比老鼠先到达食物。

C++代码:

class Solution {

public:

    int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, -1, 0, 1};

    vector<string> g;

    int n, m, cat, mouse, food, catJump, mouseJump;

    int f[70][70][210];

    int dp(int C, int M, int step) {

        if(C == food || step > 200 || M == C) return 0;

        if(M == food) return 1;

        if(f[C][M][step] != -1) return f[C][M][step];

        int res = dp(C, M, step + 1);

        if(step & 1) {

            // 猫走

            for(int i=0; i<4; i++) {

                int x = C/m, y=C%m;

                for(int j=1; j<=catJump; j++) {

                    int a = x + dx[i]*j, b = y + dy[i]*j;

                    if(a >= n || a < 0 || b >=m || b < 0 || g[a][b] == '#') break;

                    res &= dp(a*m+b, M, step+1);

                }

            }

        } else {

            // 鼠走

            for(int i=0; i<4; i++) {

                int x = M/m, y = M%m;

                for(int j=1; j<=mouseJump; j++) {

                    int a = x + dx[i]*j, b = y + dy[i]*j;

                    if(a >= n || a < 0 || b >=m || b < 0 || g[a][b] == '#') break;

                    res |= dp(C, a*m+b, step + 1);

                }

            }

        }

        return f[C][M][step] = res;

    }

    bool canMouseWin(vector<string>& grid, int _catJump, int _mouseJump) {

        memset(f, -1, sizeof f);

        g = grid, n = g.size(), m = grid[0].size(), catJump = _catJump, mouseJump = _mouseJump;

        for(int i=0; i<n; i++) {

            for(int j=0; j<m; j++){

                if(g[i][j] == 'C') cat = i * m + j;

                else if(g[i][j] == 'M') mouse = i * m + j;

                else if(g[i][j] == 'F') food = i * m + j;

            }

        } 

        return dp(cat, mouse, 0);

    }

};

leetcode---1728. 猫和老鼠 II相关推荐

  1. [H博弈论] lc1728. 猫和老鼠 II(博弈论+记忆化搜索+周赛224_4)

    文章目录 1. 题目来源 2. 题目解析 1. 题目来源 链接:1728. 猫和老鼠 II 2. 题目解析 棋盘类博弈论问题大多数采用记忆化搜索来进行优化.有效的状态空间没那么多,大多数都 break ...

  2. 【暴力枚举】LeetCode 90. Subsets II

    LeetCode 90. Subsets II solution1和2均是利用set的,3和4是不利用set的 Solution1:我的答案 迭代法 class Solution { public:v ...

  3. 【DFS】LeetCode 52. N-Queens II

    LeetCode 52. N-Queens II Solution1:我的答案 教科书一样的回溯法 <程序员面试金典>中有一道一毛一样的题啊! class Solution { publi ...

  4. 【数字全排列】LeetCode 47. Permutations II

    LeetCode 47. Permutations II Solution1:我的答案 笨蛋方法:和第46题的思路差不多,把vector换成了set就OK啦~~~ class Solution { p ...

  5. [LeetCode] Word Break II 拆分词句之二

    [LeetCode] Word Break II 拆分词句之二 Given a string s and a dictionary of words dict, add spaces in s to ...

  6. LeetCode题解(1728):猫和老鼠II(Python)

    题目:原题链接(困难) 标签:动态规划 解法 时间复杂度 空间复杂度 执行用时 Ans 1 (Python) – – 520ms (96.20%) Ans 2 (Python) Ans 3 (Pyth ...

  7. [LeetCode]Single Number II

    今天室友推荐了一道LeetCode上面的练习题Single Number II,题目大概的意思是有一个整形的数组,里面只有一个数是出现一次的,其他的数都出现了三次,然后让把这个数找出来. 第一眼看到这 ...

  8. leetcode 90. 子集 II 思考分析

    与本题相关联的题目解析: leetcode 78. 子集 思考分析 leetcode 40. 组合总和 II思考分析 题目 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集 ...

  9. leetcode Course Schedule II

    题目连接 https://leetcode.com/problems/course-schedule-ii/ Course Schedule II Description There are a to ...

  10. LeetCode 47 全排列 II -- 回溯法

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/permutations-ii 题意: 给定一个可包含重复数字的序列 nums ,按任意顺序 返 ...

最新文章

  1. 深度盘点Python11个主流框架:Pandas、Django、Matplotlib、Numpy、PyTorch......
  2. java进城杀不死怎么办_linux – 如何杀死永不死的进程?
  3. swift_024(Swift 的构造过程)
  4. 数据中心网络架构 — 云数据中心网络 — 大二层网络技术
  5. mysql backlog_一次优化引发的血案
  6. Minimum Array
  7. 任何字符串indexOf(‘‘)返回都是0,数组indexOf(‘‘)返回是-1
  8. c语言字符串字节数函数,C语言字符,字符串,字节操作常用函数
  9. Visio中图进行任意区域进行颜色填充
  10. 谨防职业病 IT人士必不可少的四类食物
  11. ROS2的学习笔记(legacy)
  12. 数据科学包15-matplotlib详细介绍
  13. 微PE系统盘制作 / 重装系统
  14. Chrome启动参数大全
  15. 小程序 | 微信小程序布局左对齐自动换行
  16. java语言程序设计二级_计算机二级Java语言程序设计试题
  17. Python使用wordcloud做词云
  18. 【Proteus仿真】TLC5615输出256点正弦波(振幅可调)
  19. 机器人视觉系统分为哪几种,主要包括哪些关键技术?
  20. 【小程序源码】同名在线查询系统

热门文章

  1. 如何将WebRoot部署到tomcat中
  2. 皮尔森残差_残差与标准化残差
  3. JQuery插件之图片轮播插件–slideBox
  4. ElasticSearch(十二):Spring Data ElasticSearch 的使用(二)
  5. jenkins 国内插件源无效问题的解决方案
  6. 图纸打印什么时候用蓝图_为什么工程图纸都是蓝色的?是叫“蓝图”吗?
  7. WordPress防止自动压缩jpg图片
  8. html背景图怎么做成水印,如何制作出有水印feel的PPT背景图片
  9. iOS 去除字符串中的H5标签
  10. 脑电数据处理分析教程汇总(eeglab, mne-python)