日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2024/7/5 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 1391. 检查网格中是否存在有效路径(BFS) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 1. 題目
    • 2. 解題
      • 2.1 BFS
      • 2.2 爆棧的DFS
      • 2.3 不爆棧的DFS

1. 題目

給你一個(gè) m x n 的網(wǎng)格 grid。網(wǎng)格里的每個(gè)單元都代表一條街道。grid[i][j] 的街道可以是:

  • 1 表示連接左單元格和右單元格的街道。
  • 2 表示連接上單元格和下單元格的街道。
  • 3 表示連接左單元格和下單元格的街道。
  • 4 表示連接右單元格和下單元格的街道。
  • 5 表示連接左單元格和上單元格的街道。
  • 6 表示連接右單元格和上單元格的街道。

    你最開(kāi)始從左上角的單元格 (0,0) 開(kāi)始出發(fā),網(wǎng)格中的「有效路徑」是指從左上方的單元格 (0,0) 開(kāi)始、一直到右下方的 (m-1,n-1) 結(jié)束的路徑。該路徑必須只沿著街道走。

注意:你 不能 變更街道。

如果網(wǎng)格中存在有效的路徑,則返回 true,否則返回 false 。

示例 1:

輸入:grid = [[2,4,3],[6,5,2]] 輸出:true 解釋:如圖所示,你可以從 (0, 0) 開(kāi)始,訪(fǎng)問(wèn)網(wǎng)格中的所有單元格并到達(dá) (m - 1, n - 1)

示例 2:

輸入:grid = [[1,2,1],[1,2,1]] 輸出:false 解釋:如圖所示,單元格 (0, 0) 上的街道沒(méi)有與任何其他單元格上的街道相連,你只會(huì)停在 (0, 0) 處。示例 3: 輸入:grid = [[1,1,2]] 輸出:false 解釋:你會(huì)停在 (0, 1),而且無(wú)法到達(dá) (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

來(lái)源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/check-if-there-is-a-valid-path-in-a-grid
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

2. 解題

2.1 BFS

  • 廣度優(yōu)先搜索
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]}};//網(wǎng)格可走的方向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){ //網(wǎng)格可走方向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 走過(guò)來(lái)的方向,在位置 x y 中有對(duì)應(yīng)的接口,則可以走過(guò)來(lái)if(dx == 1 && dy ==0)//往下走,對(duì)應(yīng)x,y處 '上' 要開(kāi)著{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 方法爆棧,代碼如下,請(qǐng)大佬幫忙看看什么原因

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)//往下走,對(duì)應(yīng)x,y處 '上' 要開(kāi)著{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 函數(shù) 的 int 變量去掉 & 就不報(bào)錯(cuò)了,什么情況。。。
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)//往下走,對(duì)應(yīng)x,y處 '上' 要開(kāi)著{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;} };

總結(jié)

以上是生活随笔為你收集整理的LeetCode 1391. 检查网格中是否存在有效路径(BFS)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。