【力扣·每日一题】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;
            }
        }
    }
};


目录
相关文章
|
1月前
|
算法 索引
LeetCode(搜索插入位置)
如何使用二分查找算法来解决LeetCode上的“搜索插入位置”问题,确保时间复杂度为O(log n),并提供了详细的代码实现和分析。
14 2
|
1月前
|
索引
Leetcode第三十三题(搜索旋转排序数组)
这篇文章介绍了解决LeetCode第33题“搜索旋转排序数组”的方法,该问题要求在旋转过的升序数组中找到给定目标值的索引,如果存在则返回索引,否则返回-1,文章提供了一个时间复杂度为O(logn)的二分搜索算法实现。
18 0
Leetcode第三十三题(搜索旋转排序数组)
|
1月前
【LeetCode 39】700.二叉搜索树中的搜索
【LeetCode 39】700.二叉搜索树中的搜索
14 0
|
1月前
|
存储 算法 决策智能
【算法】博弈论(C/C++)
【算法】博弈论(C/C++)
|
1月前
|
存储 算法 C++
【搜索算法】 跳马问题(C/C++)
【搜索算法】 跳马问题(C/C++)
|
1月前
|
人工智能 算法 Java
【搜索算法】数字游戏(C/C++)
【搜索算法】数字游戏(C/C++)
|
3月前
|
算法
LeetCode第81题搜索旋转排序数组 II
文章讲解了LeetCode第81题"搜索旋转排序数组 II"的解法,通过二分查找算法并加入去重逻辑来解决在旋转且含有重复元素的数组中搜索特定值的问题。
LeetCode第81题搜索旋转排序数组 II
|
3月前
|
算法
LeetCode第74题搜索二维矩阵
文章讲解了LeetCode第74题"搜索二维矩阵"的解决方案,利用二分搜索法将问题简化,并通过数学转换找到二维矩阵中的对应元素,展示了将二维问题转化为一维问题的解题技巧。
LeetCode第74题搜索二维矩阵
|
3月前
|
算法
LeetCode第35题搜索插入位置
这篇文章介绍了LeetCode第35题"搜索插入位置"的解题方法,通过使用二分查找法,高效地找到在有序数组中插入一个目标数的最佳位置。
LeetCode第35题搜索插入位置
|
3月前
|
算法
LeetCode第33题搜索旋转排序数组
这篇文章介绍了LeetCode第33题"搜索旋转排序数组"的解题方法,通过使用二分查找法并根据数组的有序性质调整搜索范围,实现了时间复杂度为O(log n)的高效搜索算法。
LeetCode第33题搜索旋转排序数组