LeetCode 1391. 检查网格中是否存在有效路径(BFS)

文章目录

    • 1. 题目
    • 2. 解题
      • 2.1 BFS
      • 2.2 爆栈的DFS
      • 2.3 不爆栈的DFS

1. 题目

给你一个 m x n 的网格 grid。网格里的每个单元都代表一条街道。grid[i][j] 的街道可以是:

  • 1 表示连接左单元格和右单元格的街道。
  • 2 表示连接上单元格和下单元格的街道。
  • 3 表示连接左单元格和下单元格的街道。
  • 4 表示连接右单元格和下单元格的街道。
  • 5 表示连接左单元格和上单元格的街道。
  • 6 表示连接右单元格和上单元格的街道。
    在这里插入图片描述
    你最开始从左上角的单元格 (0,0) 开始出发,网格中的「有效路径」是指从左上方的单元格 (0,0) 开始、一直到右下方的 (m-1,n-1) 结束的路径。该路径必须只沿着街道走。

注意:你 不能 变更街道。

如果网格中存在有效的路径,则返回 true,否则返回 false 。

示例 1:
在这里插入图片描述

输入:grid = [[2,4,3],[6,5,2]]
输出:true
解释:如图所示,你可以从 (0, 0) 开始,访问网格中的所有单元格并到达 (m - 1, n - 1)

示例 2:
在这里插入图片描述

输入:grid = [[1,2,1],[1,2,1]]
输出:false
解释:如图所示,单元格 (0, 0) 上的街道没有与任何其他单元格上的街道相连,你只会停在 (0, 0) 处。示例 3:
输入:grid = [[1,1,2]]
输出:false
解释:你会停在 (0, 1),而且无法到达 (0, 2) 。示例 4:
输入:grid = [[1,1,1,1,1,1,3]]
输出:true示例 5:
输入:grid = [[2],[2],[2],[2],[2],[2],[6]]
输出:true提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 300
1 <= grid[i][j] <= 6

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/check-if-there-is-a-valid-path-in-a-grid
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

2.1 BFS

  • 广度优先搜索
class Solution {vector<vector<int>> d = {{0,1},{1,0},{-1,0},{0,-1}};//右0,下1,上2,左3vector<vector<vector<int>>> dir = {{},{d[0],d[3]},{d[1],d[2]},{d[1],d[3]},{d[0],d[1]},{d[2],d[3]},{d[0],d[2]}};//网格可走的方向int m,n;
public:bool hasValidPath(vector<vector<int>>& grid) {m = grid.size(), n = grid[0].size();vector<vector<bool>> visited(m, vector<bool>(n,false));visited[0][0] = true;queue<vector<int>> q;q.push({0,0});int x,y,x0,y0,k,dx,dy;while(!q.empty()){x0 = q.front()[0];y0 = q.front()[1];if(x0==m-1 && y0==n-1)return true;q.pop();for(k = 0; k < dir[grid[x0][y0]].size(); ++k){	//网格可走方向dx = dir[grid[x0][y0]][k][0];dy = dir[grid[x0][y0]][k][1];x = x0+dx;y = y0+dy;if(x>=0 && x<m && y>=0 && y<n && !visited[x][y] && isok(grid,dx,dy,x,y)){visited[x][y] = true;q.push({x,y});}}}return false;}bool isok(vector<vector<int>>& grid, int &dx, int &dy, int &x, int &y){	//dx dy 走过来的方向,在位置 x y 中有对应的接口,则可以走过来if(dx == 1 && dy ==0)//往下走,对应x,y处 '上' 要开着{if(grid[x][y]==2 || grid[x][y]==5 || grid[x][y]==6)return true;}else if(dx == 0 && dy == 1)//右   --左{if(grid[x][y]==1 || grid[x][y]==3 || grid[x][y]==5)return true;}else if(dx == -1 && dy == 0)//上 ---下{if(grid[x][y]==2 || grid[x][y]==3 || grid[x][y]==4)return true;}else if(dx == 0 && dy == -1)//左--- 右{if(grid[x][y]==1 || grid[x][y]==4 || grid[x][y]==6)return true;}return false;}
};

在这里插入图片描述

2.2 爆栈的DFS

  • dfs 方法爆栈,代码如下,请大佬帮忙看看什么原因

在这里插入图片描述

class Solution {vector<vector<int>> d = {{0,1},{1,0},{-1,0},{0,-1}};//右0,下1,上2,左3vector<vector<vector<int>>> dir = {{},{d[0],d[3]},{d[1],d[2]},{d[1],d[3]},{d[0],d[1]},{d[2],d[3]},{d[0],d[2]}};bool found = false;int m,n;
public:bool hasValidPath(vector<vector<int>>& grid) {m = grid.size(), n = grid[0].size();vector<vector<bool>> visited(m, vector<bool>(n,false));visited[0][0] = true;dfs(grid,0,0,visited);return found;}void dfs(vector<vector<int>>& grid, int i, int j,vector<vector<bool>> &visited){if(found)return;if(i==m-1 && j==n-1){found = true;return;}int x, y, k, dx, dy;for(k = 0; k < dir[grid[i][j]].size(); ++k){dx = dir[grid[i][j]][k][0];dy = dir[grid[i][j]][k][1];x = i+dx;y = j+dy;if(x>=0 && x<m && y>=0 && y<n && !visited[x][y] && isok(grid,dx,dy,x,y)){visited[x][y] = true;dfs(grid,x,y,visited);visited[x][y] = false;}}}bool isok(vector<vector<int>>& grid, int &dx, int &dy, int &x, int &y){if(dx == 1 && dy ==0)//往下走,对应x,y处 '上' 要开着{if(grid[x][y]==2 || grid[x][y]==5 || grid[x][y]==6)return true;}else if(dx == 0 && dy == 1)//右   --左{if(grid[x][y]==1 || grid[x][y]==3 || grid[x][y]==5)return true;}else if(dx == -1 && dy == 0)//上 ---下{if(grid[x][y]==2 || grid[x][y]==3 || grid[x][y]==4)return true;}else if(dx == 0 && dy == -1)//左--- 右{if(grid[x][y]==1 || grid[x][y]==4 || grid[x][y]==6)return true;}return false;}
};

2.3 不爆栈的DFS

  • isok 函数 的 int 变量去掉 & 就不报错了,什么情况。。。
class Solution {vector<vector<int>> d = {{0,1},{1,0},{-1,0},{0,-1}};//右0,下1,上2,左3vector<vector<vector<int>>> dir = {{},{d[0],d[3]},{d[1],d[2]},{d[1],d[3]},{d[0],d[1]},{d[2],d[3]},{d[0],d[2]}};bool found = false;int m,n;
public:bool hasValidPath(vector<vector<int>>& grid) {m = grid.size(), n = grid[0].size();vector<vector<bool>> visited(m, vector<bool>(n,false));visited[0][0] = true;dfs(grid,0,0,visited);return found;}void dfs(vector<vector<int>>& grid, int i, int j,vector<vector<bool>> &visited){if(found)return;if(i==m-1 && j==n-1){found = true;return;}int x, y, k, dx, dy;for(k = 0; k < dir[grid[i][j]].size(); ++k){dx = dir[grid[i][j]][k][0];dy = dir[grid[i][j]][k][1];x = i+dx;y = j+dy;if(x>=0 && x<m && y>=0 && y<n && !visited[x][y] && isok(grid,dx,dy,x,y)){visited[x][y] = true;dfs(grid,x,y,visited);visited[x][y] = false;}}}bool isok(vector<vector<int>> &grid, int dx, int dy, int x, int y){if(dx == 1 && dy ==0)//往下走,对应x,y处 '上' 要开着{if(grid[x][y]==2 || grid[x][y]==5 || grid[x][y]==6)return true;}else if(dx == 0 && dy == 1)//右   --左{if(grid[x][y]==1 || grid[x][y]==3 || grid[x][y]==5)return true;}else if(dx == -1 && dy == 0)//上 ---下{if(grid[x][y]==2 || grid[x][y]==3 || grid[x][y]==4)return true;}else if(dx == 0 && dy == -1)//左--- 右{if(grid[x][y]==1 || grid[x][y]==4 || grid[x][y]==6)return true;}return false;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/476929.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件oem要注意什么_化妆品OEM客户要着重注意这3个基本点,不然就吃大亏了

作为品牌方客户&#xff0c;确定化妆品OEM代工后&#xff0c;虽然生产的一切事务由化妆品OEM工厂完成&#xff0c;但是仍然需要注意这3个基本点&#xff01;1. 合规性首先&#xff0c;产品只有备案流程全部完成&#xff0c;并且通过后才能进入市场销售&#xff0c;正常情况下是…

沉痛悼念!中国NLP 先行者、机器翻译鼻祖刘倬逝世

作者 | 李梅编辑 | 陈彩娴来源 | AI科技评论AI 科技评论获悉&#xff0c;中国机器翻译事业的开创者之一、原中国社科院语言研究所研究员刘倬老师与世长辞&#xff0c;享年 89 岁。沉痛悼念刘倬老师&#xff01;刘倬&#xff0c;1933 年 4 月 4 日生于河北省大成县。1949 年从北…

今天很累……

今天&#xff0c;用了一整天时间去研究解决Tapestry3.0的StaleLinkException问题&#xff0c;可能太集中精神了&#xff0c;下午到了快下班的时候感到十分疲倦&#xff0c;眼睛有点痛。Todays Conclusion&#xff1a;天外有天&#xff0c;人上有人&#xff0c;任何时候都需要自…

如何 给给软件开发 添加 代理_如何与软件开发公司有效沟通

从最初的想法到可运行的软件&#xff0c;软件开发过程是十分繁杂的&#xff0c;既不想被细节淹没&#xff0c;又希望留有控制力&#xff0c;与软件开发公司沟通要如何做才能事半功倍呢&#xff1f;1&#xff0c;共享业务语义所谓业务语义&#xff0c;就是需求背后所思所想&…

LeetCode 1392. 最长快乐前缀(KMP)

1. 题目 「快乐前缀」是在原字符串中既是 非空 前缀也是后缀&#xff08;不包括原字符串自身&#xff09;的字符串。 给你一个字符串 s&#xff0c;请你返回它的 最长快乐前缀。 如果不存在满足题意的前缀&#xff0c;则返回一个空字符串。 示例 1&#xff1a; 输入&#x…

火到海外破圈!这个国产AI项目GitHub标星8.6k,价值千万

Q&#xff1a;最顶尖的AI技术到底离我们有多远&#xff1f; A&#xff1a;三行Python代码的距离。 导读 今天小编为大家推荐一个AI领域相当优秀的项目&#xff0c; 粗略估计&#xff0c;这个项目价值超过千万&#xff0c; 当前star 8.6k&#xff0c;大胆预判&#xff0c;这个项…

让互联网助小组合作一臂之力

利用互联网实现小组合作&#xff0c;目前显然还有诸多不便&#xff0c;原因何在&#xff1f;许多人都在网上实现了互联&#xff0c;小组合作似乎应该有诸多便利。但为什么维护一个可供小组其他成员共享和编辑的文件夹依然困难重重&#xff1f;为什么如果大家不使用相同的即时通…

程序员面试金典 - 面试题 10.05. 稀疏数组搜索(二分查找)

1. 题目 稀疏数组搜索。有个排好序的字符串数组&#xff0c;其中散布着一些空字符串&#xff0c;编写一种方法&#xff0c;找出给定字符串的位置。 示例1:输入: words ["at", "", "", "", "ball", "", "&…

颤抖吧,打工人!Meta研发裁员算法,Xsolla用AI模型打绩效??

撰稿丨千山审校丨云昭来源丨51CTO技术栈这几个月来&#xff0c;微软、谷歌、甲骨文、苹果等一众科技巨头纷纷裁员。日前&#xff0c;Meta成为又一家启动大规模裁员的科技公司。在这波裁员潮中&#xff0c;Meta的操作引起了诸多争议。争议焦点在于它将裁员的决定权“交”给了算法…

android制作相册浏览器_一分钟简单制作一个专属于自己的卡通头像

制作一个专属于自己的卡通头像很简单&#xff0c;我们常用的美图秀秀软件就可以轻松制作。首选在应用市场搜索美图秀秀下载后选择工具箱打开&#xff0c;找到实用工具中的动漫化身这个选项&#xff1b;打开后点击绘制动漫形象&#xff0c;可以在相册中选择一张提前保存好的头像…

用MS SQL Server事件探查器来跟踪数据库的操作

在MS SQL Server中&#xff0c;除了我们常用的企业管理器和查询分析器之外&#xff0c;还有一个非常有用的工具——事件探查器。由于这两天&#xff0c;我需要知道一个ASP.NET程序对某个数据库的哪些表进行了哪些操作&#xff0c;所以才发现了这个工具的好处&#xff01; …

程序员面试金典 - 面试题 05.02. 二进制数转字符串(浮点型 转 二进制小数,乘2取整)

1. 题目 二进制数转字符串。给定一个介于0和1之间的实数&#xff08;如0.72&#xff09;&#xff0c;类型为double&#xff0c;打印它的二进制表达式。 如果该数字不在0和1之间&#xff0c;或者无法精确地用32位以内的二进制表示&#xff0c;则打印“ERROR”。 示例1:输入&a…

blob数据类型_MySQL的数据类型

一,MySQL的数据类型数据类型是定义列中可以存储什么类型的数据以及该数据实际怎样存储的基本规则数据类型限制存储在数据列列中的数据。例如&#xff0c;数值数据类型列只能接受数值类型的的数据在设计表时&#xff0c;应该特别重视所用的数据类型。使用错误的数据类型可能会严…

仿真方面的文章

仿真方面的文章&#xff1a;献给初学者 promodel, em_plant离散事件系统仿真技术主要用于解决复杂系统管理中的决策问题&#xff0c;这里的管理具有广泛的意义&#xff0c;既可以是企业&#xff0c;工作的计划&#xff0c;调度和销售管理&#xff0c;也可以是导弹防御&#xff…

科技部发布新规:论文挂名属于学术不端,记入科研诚信数据库!

文 | 募格学术源 | 科技日报、科技部时隔三年后&#xff0c;《科研诚信案件调查处理规则&#xff08;试行&#xff09;》迎来修订版。9月14日&#xff0c;科技部、中央宣传部等二十二部门印发《科研失信行为调查处理规则》&#xff08;以下简称《规则》&#xff09;&#xff0c…

C++ 内存对齐 及 引用是否真的节省内存的一点思考

文章目录1. 内存对齐2. 递归中的内存对齐3. C引用的本质4. 致谢1. 内存对齐 通过以下语句&#xff0c;获取变量的占用内存打下&#xff1a; cout << "size of int " << sizeof(int) << endl; cout << "size of int& " <&…

小问题,对递归重复调用的改进,一起来分享

Problem设有一头小母牛&#xff0c;从出生第四年起每年生一头小母牛&#xff0c;按此规律&#xff0c;第N年时有几头母牛&#xff1f; Input本题有多组数据。每组数据只有一个整数N&#xff0c;独占一行。(1≤N≤50) Output对每组数据&#xff0c;输出一个整数&#xff08;独…

拦截游戏窗口被移动_Ruined King官网版-拳头rpg Ruined King游戏最新版下载v1.0

Ruined King是一款暗黑风格的动作冒险类手游&#xff0c;游戏采用回合制战斗方式为玩家进行呈现&#xff0c;多种强大的英雄需要玩家进行召集&#xff0c;大幅度提升角色的战斗力&#xff0c;丰富的任务等着玩家来完成&#xff0c;游戏中还有非常经典的剧情让玩家进行了解&…

AI开始卷高考了,英语已被卷到134分??

文 | 天于刀刀AI 真的太卷了&#xff01;不但模型之间互相卷&#xff0c;现在直接开始和人类学生一起卷高考了&#xff01;近期&#xff0c;来自 CMU 两位学者提出的重构预训练模型&#xff08;reStructured Pre-training, RST&#xff09;在只有 GPT-3 十六分之一参数量的情况…

(待解)静态构造器和静态字段调用的相互嵌套

示例代码&#xff1a;usingSystem;classA{ public static int X; static A() { X B.Y 1; }}classB{ public static int Y A.X 1; static B() {} static void Main() { Console.WriteLine("X {0}, Y {1}", A.X, B.Y); }}程序输出&#…