最终可能的状态:
1.猫先到达食物
2.猫先到达老鼠
3.老鼠先到达食物
4.老鼠和猫都到不了食物,且猫也在1000回合内抓不到老鼠(设想一种情形:食物被墙挡住了,猫和老鼠谁也到达不了,二者以相同的速度兜圈圈)

由于最终可能的状态是确定的,我们可以用最终结果来反推。`

class Solution {int memo[9][9][9][9][3];pair<int,int> food;pair<int,int> mouse;pair<int,int> cat;int mouseJump;int catJump;vector<string> grid;
public:bool canMouseWin(vector<string>& grid, int catJump, int mouseJump) {int rows=grid.size();int cols=grid[0].size();this->catJump=catJump;this->mouseJump=mouseJump;this->grid=grid;for(int i=0;i<rows;i++){for(int j=0;j<cols;j++){if(grid[i][j]=='F') food={i,j};if(grid[i][j]=='M') mouse={i,j};if(grid[i][j]=='C') cat={i,j};}}queue<array<int,5>> q;for(int i=0;i<rows;i++){for(int j=0;j<cols;j++)for(int t=1;t<=2;t++){//不论是轮到猫还是鼠if(grid[i][j]=='#') continue;if(i==food.first && j==food.second)    continue;// 排除掉老鼠、猫、食物三者在同一位置memo[i][j][food.first][food.second][t]=2;//1.猫先到食物,猫赢memo[food.first][food.second][i][j][t]=1;// 2.老鼠先到食物,老鼠赢q.push({i,j,food.first,food.second,t});q.push({food.first,food.second,i,j,t});}}for(int i=0;i<rows;i++){for(int j=0;j<cols;j++)for(int t=1;t<=2;t++){//不论是轮到猫还是鼠if(grid[i][j]=='#') continue;memo[i][j][i][j][t]=2;//3.猫鼠在同一位置,猫赢q.push({i,j,i,j,t});}}int step=0;while(!q.empty()){step++;if(step>2000)   return false;int len=q.size();while(len--){int mx=q.front()[0];int my=q.front()[1];int cx=q.front()[2];int cy=q.front()[3];int t=q.front()[4];int status=memo[mx][my][cx][cy][t];//status表示该状态对应的输赢结果,输赢结果上面已经存在了memo里面q.pop();for(auto next:findAllAdjacents(mx,my,cx,cy,t)){//考虑所有上一层邻接结点int mx1=next[0];int my1=next[1];int cx1=next[2];int cy1=next[3];int t1=next[4];if(memo[mx1][my1][cx1][cy1][t1]!=0) continue;if(t1==status){//比如,轮到猫走,memo是鼠必败(猫赢);或者,轮到鼠走,memo是猫必败(鼠赢)//t1取值有1,2。1表示轮到鼠,2表述轮到猫//status取值有1,2,3。1表示鼠赢,2表示猫赢,3表示和棋memo[mx1][my1][cx1][cy1][t1]=status;q.push({mx1,my1,cx1,cy1,t1});}else if(allAdjacentsWin(mx1,my1,cx1,cy1,t1)){//不能判断出必赢,那么考虑是否必败//考虑其对手轮次,即下一层邻接结点是必赢还是必输memo[mx1][my1][cx1][cy1][t1]=(t1==1)?2:1;//t1和status一定一个是1,另一个就是2q.push({mx1,my1,cx1,cy1,t1});}}}}return memo[mouse.first][mouse.second][cat.first][cat.second][1] == 1;//回到初始态,轮到老鼠走且老鼠必赢则返回true}vector<array<int,5>> findAllAdjacents(int mx,int my,int cx,int cy,int t){//逆推vector<array<int,5>> adjacents;int rows=grid.size();int cols=grid[0].size();auto dir = vector<pair<int,int>>({{1,0},{-1,0},{0,1},{0,-1}});if(t==1){//如果该轮为老鼠轮,我们必须按照猫的步伐来推,则猫动for(int k=0;k<4;k++){//四个方向for(int d=0;d<=catJump;d++){int cx1=cx+dir[k].first*d;int cy1=cy+dir[k].second*d;if(cx1<0 || cx1>=rows || cy1<0 || cy1>=cols)  continue;//判断是否越界if(grid[cx1][cy1]=='#') break;//不能碰壁adjacents.push_back({mx,my,cx1,cy1,2});}}}if(t==2){//如果该轮为猫轮,我们必须按照鼠的步伐来推,则鼠动for(int k=0;k<4;k++){//四个方向for(int d=0;d<=mouseJump;d++){int mx1=mx+dir[k].first*d;int my1=my+dir[k].second*d;if(mx1<0 || mx1>=rows || my1<0 || my1>=cols)  continue;//判断是否越界if(grid[mx1][my1]=='#') break;//不能碰壁adjacents.push_back({mx1,my1,cx,cy,1});}}}return adjacents;}bool allAdjacentsWin(int mx,int my,int cx,int cy,int t){//正推int rows=grid.size();int cols=grid[0].size();auto dir = vector<pair<int,int>>({{1,0},{-1,0},{0,1},{0,-1}});if(t==1){for(int k=0;k<4;k++){//四个方向for(int d=0;d<=mouseJump;d++){int mx1=mx+dir[k].first*d;int my1=my+dir[k].second*d;if(mx1<0 || mx1>=rows || my1<0 || my1>=cols)  break;//判断是否越界if(grid[mx1][my1]=='#') break;//不能碰壁if(memo[mx1][my1][cx][cy][2]!=2)    return false;}}}if(t==2){for(int k=0;k<4;k++){//四个方向for(int d=0;d<=catJump;d++){int cx1=cx+dir[k].first*d;int cy1=cy+dir[k].second*d;if(cx1<0 || cx1>=rows || cy1<0 || cy1>=cols)  break;//判断是否越界if(grid[cx1][cy1]=='#') break;//不能碰壁if(memo[mx][my][cx1][cy1][1]!=1)    return false;}}}return true;     }
};

leetcode1728. 猫和老鼠 II(分析三——算法部分2)相关推荐

  1. 《Python机器学习——预测分析核心算法》——2.4 基于因素变量的实数值预测:鲍鱼的年龄...

    本节书摘来异步社区<Python机器学习--预测分析核心算法>一书中的第2章,第2.4节,作者:[美]Michael Bowles(鲍尔斯),更多章节内容可以访问云栖社区"异步社 ...

  2. 《Python机器学习——预测分析核心算法》——2.5 用实数值属性预测实数值目标:评估红酒口感...

    本节书摘来异步社区<Python机器学习--预测分析核心算法>一书中的第2章,第2.5节,作者:[美]Michael Bowles(鲍尔斯),更多章节内容可以访问云栖社区"异步社 ...

  3. 程振波 算法设计与分析_算法设计与分析

    本书按照教育部*制定的计算机科学与技术专业规范的教学大纲编写,努力与国际计算机学科的教学要求接轨.强调 算法 与 数据结构 之间密不可分的联系,因而强调融数据类型与定义在该类型上的运算于一体的抽象数据 ...

  4. 010Edit分析 爆破 + 算法逆向 + 注册机编写

    爆破 假码 pName = xuanci pKey = 00112233445566778899 登录出错 复制错误信息 --------------------------- 010 Editor ...

  5. 一项关于使用非参数检验分析进化算法行为的研究:2005年中欧委员会实参数优化特别会议的案例研究

    一项关于使用非参数检验分析进化算法行为的研究:2005年中欧委员会实参数优化特别会议的案例研究 Abstract 摘要近年来,在进化算法领域,实验分析越来越受到人们的关注.值得注意的是,目前已有大量的 ...

  6. 算法设计与分析——蒙特卡罗算法(简单、通俗、易懂)C++

    算法设计与分析--蒙特卡罗算法(简单.通俗.易懂) 虽然都是文字描述,但都是较为通俗的语言,相信你看完应该能理解 在实际应用中会遇到一些问题,不论采用确定性算法还是随机性算法,都无法保证每次能到到正确 ...

  7. 唯品会app请求头参数authorization的逆向分析与算法还原

    声明:本文内容仅供学习交流,严禁用于商业用途,否则由此产生的一切后果均与作者无关.如有冒犯,请联系我删除. 一.说明 app版本: v7.45.6 下载地址:aHR0cHM6Ly93d3cud2FuZ ...

  8. 【详细版】独立成分分析:算法和应用(一)

    独立成分分析:算法和应用 翻译原文+自己的理解 原文:Independent component analysis: algorithms and applications 作者:A. Hyvarin ...

  9. 三年级学生计算机学情分析,三年级上学期学生学情分析

    010在线为您甄选多篇描写三年级上学期学生学情分析,三年级上学期学生学情分析精选,三年级上学期学生学情分析大全,有议论,叙事 ,想象等形式.文章字数有400字.600字.800字....缓存时间: 2 ...

最新文章

  1. 有的人在25岁时就死了,但在75岁时才被埋葬:周鸿祎
  2. Opencv多通道分离函数split()和多通道合并函数merge的使用
  3. 《好未来编程题》 输入n个整数,输出出现次数大于等于数组长度一半的数
  4. Lync Server 2010迁移至Lync Server 2013部署系列 Part3:部署后端备用服务器
  5. 一个简单又高效的日志系统
  6. red flag linux指定域名,Red Flag Server 4.1 系统管理手册(适用桌面linux4.1) 6
  7. React.js 组件的 props vs state
  8. HarmonyOS开源第三方组件 —— B站开源弹幕库引擎的使用
  9. 联想微型计算机设置从u盘启动,联想台式机设置从u盘启动图文教程
  10. xposed模拟器安装
  11. LOGO特训营 第一节 鉴别Logo与Logo设计思路
  12. Ubuntu 可视化图片——eog
  13. Mysql数据库管理
  14. Shell脚本-NF、FS(OFS)、RS(ORS)、NR(FNR)
  15. Java 已知三边求三角形求面积
  16. php mysql 压力测试_MySQL的性能基线收集及压力测试
  17. 交换机的4种网络结构方式:级联方式、堆叠方式、端口聚合方式、分层方式
  18. Nginx-域名跳转到另外一个域名
  19. 代码 马佳义_【图像融合学习笔记002】图像融合论文及代码网址整理总结(2)——红外与可见光图像融合...
  20. 计算机操作系统例题总结

热门文章

  1. MATLAB 串口通信的实现。。
  2. Unity3D学习之第二个游戏制作日记
  3. 【C++】读取 .csv / .xlsx 文件中的指定数据(非常实用)
  4. Java实现Excel表格数据的导入(兼容xls与xlsx)
  5. Java中Cookie详解
  6. Android 高德地图入门指南
  7. 带着问题读 TiDB 源码:Power BI Desktop 以 MySQL 驱动连接 TiDB 报错
  8. 石油信息化新技术应用前景
  9. hdu5445 Food Problem(背包)
  10. js-二维数组和多维数组