【力扣·每日一题】913. 猫和老鼠(C++ 记忆化搜索 博弈)

简介: 【力扣·每日一题】913. 猫和老鼠(C++ 记忆化搜索 博弈)

linkk

题意:

20200401134307494.png

思路:

采用记忆化搜索,dp[t][x][y]表示走了t步后老鼠在x猫在y时的状态。

初始将dp数组都设为-1,表示未被经过。

dfs搜索,传的参数未当前的步数t,老鼠的位置x,猫的位置y。然后进行判断:


如果当前的步数>=2n 返回0平局

如果x=y 则猫赢 返回2

如果x=0 老鼠赢 返回1

对老鼠而言,遍历相邻的节点时 如果返回值为1 则老鼠肯定赢;如果返回值为2,则老鼠可以不走这一步;如果返回值为0,则可能是平局,但猫一定赢不了,所以标记flag=false;最后判断flag的值,如果flag为true的话,说明是老鼠输了;否则,为平局。

猫的过程也同理。

注意:猫不能走0

代码:

class Solution {
public:
    int catMouseGame(vector<vector<int>>& graph) {
        int n=graph.size();
        vector<vector<vector<int>>>dp(2*n,vector<vector<int>>(n,vector<int>(n,-1)));
        return dfs(graph,0,1,2,dp);
    }
    int dfs(vector<vector<int>>&graph,int t,int x,int y,vector<vector<vector<int>>>&dp){
        if(t==graph.size()*2) return 0;
        if(x==y){
            dp[t][x][y]=2;return 2;
        }
        if(x==0){
            dp[t][x][y]=1;return 1;
        }
        if(dp[t][x][y]!=-1) return dp[t][x][y];
        if(t%2==0){//老鼠走
            bool flag=true;
            for(auto tt:graph[x]){
                int now=dfs(graph,t+1,tt,y,dp);
                if(now==1){
                    dp[t][x][y]=1;return 1;
                }
                else if(now==0){
                    flag=false;
                }
            }
            if(flag){
                dp[t][x][y]=2;return 2;
            }    
            else{
                dp[t][x][y]=0;return 0;
            }
        }
        else{//猫走
            bool flag=true;
            for(auto tt:graph[y]){
                if(tt==0) continue;
                int now=dfs(graph,t+1,x,tt,dp);
                if(now==2){
                    dp[t][x][y]=2;return 2;
                }
                else if(now==0){
                    flag=false;
                }
            }
            if(flag){
                dp[t][x][y]=1;return 1;
            }    
            else{
                dp[t][x][y]=0;return 0;
            }
        }
    }
};


目录
相关文章
|
8天前
|
Go C++
【力扣】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
【2月更文挑战第18天】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
36 6
|
8天前
|
算法 Java C语言
C++和Java中的随机函数你玩明白了吗?内附LeetCode470.rand7()爆改rand10()巨详细题解,带你打败LeetCode%99选手
C++和Java中的随机函数你玩明白了吗?内附LeetCode470.rand7()爆改rand10()巨详细题解,带你打败LeetCode%99选手
|
2天前
|
机器学习/深度学习 canal NoSQL
从C语言到C++_12(string相关OJ题)(leetcode力扣)
从C语言到C++_12(string相关OJ题)(leetcode力扣)
8 0
|
2天前
|
编译器 测试技术 C语言
从C语言到C++_11(string类的常用函数)力扣58和415(下)
从C语言到C++_11(string类的常用函数)力扣58和415
4 0
|
2天前
|
存储 编译器 C语言
从C语言到C++_11(string类的常用函数)力扣58和415(中)
从C语言到C++_11(string类的常用函数)力扣58和415
6 0
|
2天前
|
存储 C语言 C++
从C语言到C++_11(string类的常用函数)力扣58和415(上)
从C语言到C++_11(string类的常用函数)力扣58和415
7 0
|
8天前
|
存储 编译器 Linux
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
|
8天前
|
存储 Java C++
leetcode 2525 根据规则将箱子分类 c++ pyhton java c题解
leetcode 2525 根据规则将箱子分类 c++ pyhton java c题解
15 1
|
8天前
|
存储 算法 数据管理
【C++入门到精通】C++入门 ——搜索二叉树(二叉树进阶)
在C++中,本文介绍了搜索二叉树(二叉搜索树,BST)的概念和基本操作,包括搜索、插入和删除。搜索操作从根节点开始,按值大小决定左右查找;插入操作找到合适位置新建节点;删除操作需考虑无子节点、单子节点和双子节点的情况。文中还提供了非递归和递归实现的C++代码示例。此外,讨论了搜索二叉树在K模型和KV模型中的应用以及性能分析,强调了保持树平衡的重要性。
19 0
|
8天前
|
C++
C++进阶--搜索二叉树
C++进阶--搜索二叉树