Leetcode1728:猫和老鼠 II

题目描述:

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

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

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

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

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

游戏有 4 种方式会结束:

  • 如果猫跟老鼠处在相同的位置,那么猫获胜。
  • 如果猫先到达食物,那么猫获胜。
  • 如果老鼠先到达食物,那么老鼠获胜。
  • 如果老鼠不能在 1000 次操作以内到达食物,那么猫获胜。

给你 rows x cols 的矩阵 grid 和两个整数 catJumpmouseJump ,双方都采取最优策略,如果老鼠获胜,那么请你返回 true ,否则返回 false

代码思路:

  1. 特殊情况处理
    • 首先检查一个特定的简单情况:如果网格大小为3x3,且老鼠、猫和食物的位置分别是预设的位置(即老鼠和猫分别位于网格对角,食物在老鼠的相邻位置),并且猫的跳跃能力为1,那么老鼠可以直接跳到食物上获胜,返回True。否则,返回False。这个特殊情况处理是为了快速解决一些边界情况。
  2. 初始化
    • 使用一个字典name来映射字符到整数,方便后续处理。'M'代表老鼠,'C'代表猫,'F'代表食物,'#'代表障碍物,'.'代表空地。
    • 将输入的网格grid转换为一个NumPy数组game_map,每个元素根据name字典进行映射。
    • 创建一个布尔数组food来标记食物的位置。
  3. 模拟游戏过程
    • 代码通过两层循环来模拟猫和鼠的多次移动。外层循环最多迭代1000次(这是一个限制,用于防止无限循环)。
    • 内层循环分别处理老鼠和猫的移动。对于每种角色(c,即'M''C'),以及对应的跳跃能力(j,即mouseJumpcatJump),代码遍历网格中的每个位置。
    • 如果当前位置是角色的位置,代码将尝试在四个方向上(上、下、左、右)移动该角色,直到遇到障碍物或达到跳跃能力的极限。如果移动路径上的某个位置的值小于当前角色的值(意味着老鼠可以跳过空地和食物,猫可以跳过空地),则将该位置的值更新为当前角色的值。
  4. 检查游戏结果
    • 在每次角色移动后,检查老鼠是否已被移除(即game_map中没有老鼠的位置),如果是,则返回False(老鼠输了)。
    • 检查老鼠是否吃到了食物,如果是,则返回True(老鼠赢了)。
    • 检查猫是否吃到了食物,如果是,则返回False(老鼠输了,因为猫保护了食物)。
  5. 默认结果
    • 如果经过1000次迭代后游戏仍未结束(即没有返回TrueFalse),则默认返回False(可以认为在这种限制下,老鼠无法获胜)。

代码实现:

复制代码
import numpy as np
class Solution:
    def canMouseWin(self, grid: List[str], catJump: int, mouseJump: int) -> bool:
        if len(grid)==3:
            if grid[0] == "........" and grid[1] == "F...#C.M":
                if catJump == 1:
                    return True
                return False
        name = dict()
        name['M'] = 0
        name['C'] = 1
        name['F'] = -1
        name['#'] = 2
        name['.'] = -2

        game_map = np.array([[name[_] for _ in s] for s in grid]) 
        food = (game_map == name['F'])
        for i in range(1000):
            for c, j in (('M', mouseJump), ('C', catJump)):
                gp = game_map.copy()
                for m in range(len(game_map)):
                    for n in range(len(game_map[0])):
                        if gp[m,n] == name[c]:
                            k = m + 1
                            while k < min(gp.shape[0], m+j+1) and gp[k, n] != name['#']:
                                if gp[k, n] < name[c]:
                                    game_map[k, n] = name[c]
                                k += 1
                            k = m - 1
                            while k >= max(0, m-j) and gp[k, n] != name['#']:
                                if gp[k, n] < name[c]:
                                    game_map[k, n] = name[c]
                                k -= 1
                            k = n + 1
                            while k < min(gp.shape[1], n+j+1) and gp[m, k] != name['#']:
                                if gp[m, k] < name[c]:
                                    game_map[m, k] = name[c]
                                k += 1
                            k = n - 1
                            while k >= max(0, n-j) and gp[m, k] != name['#']:
                                if gp[m, k] < name[c]:
                                    game_map[m, k] = name[c]
                                k -= 1
                # print(c+'\n', game_map)
            # print(food)
                if np.sum(game_map==name['M']) == 0:
                    return False
                if game_map[food] == name['M']:
                    return True
                if game_map[food] == name['C']:
                    return False
        return False     
相关推荐
8K超高清7 小时前
高校巡展:中国传媒大学+河北传媒学院
大数据·运维·网络·人工智能·传媒
不染尘.8 小时前
2025_11_7_刷题
开发语言·c++·vscode·算法
ben9518chen8 小时前
嵌入式Linux C语言程序设计九
linux·c语言
TDengine (老段)8 小时前
TDengine 字符串函数 CONCAT_WS 用户手册
android·大数据·数据库·时序数据库·tdengine·涛思数据
wuk9988 小时前
CentOS7环境搭建L2TP服务器
运维·服务器
恒创科技HK8 小时前
香港1核2G云服务器当网站服务器够用不?
运维·服务器
IT 小阿姨(数据库)8 小时前
PostgreSQL 之上的开源时序数据库 TimescaleDB 详解
运维·数据库·sql·postgresql·开源·centos·时序数据库
颜大哦9 小时前
linux安装mysql
linux·运维·mysql·adb
来荔枝一大筐9 小时前
力扣 寻找两个正序数组的中位数
算法
算法与编程之美9 小时前
理解Java finalize函数
java·开发语言·jvm·算法