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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 1368. 使网格图至少有一条有效路径的最小代价(BFS最短路径,难)

發布時間:2024/7/5 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 1368. 使网格图至少有一条有效路径的最小代价(BFS最短路径,难) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 題目

給你一個 m x n 的網格圖 grid 。 grid 中每個格子都有一個數字,對應著從該格子出發下一步走的方向。 grid[i][j] 中的數字可能為以下幾種情況:

  • 1 ,下一步往右走,也就是你會從 grid[i][j] 走到 grid[i][j + 1]
  • 2 ,下一步往左走,也就是你會從 grid[i][j] 走到 grid[i][j - 1]
  • 3 ,下一步往下走,也就是你會從 grid[i][j] 走到 grid[i + 1][j]
  • 4 ,下一步往上走,也就是你會從 grid[i][j] 走到 grid[i - 1][j]
    注意網格圖中可能會有 無效數字 ,因為它們可能指向 grid 以外的區域。

一開始,你會從最左上角的格子 (0,0) 出發。我們定義一條 有效路徑 為從格子 (0,0) 出發,每一步都順著數字對應方向走,最終在最右下角的格子 (m - 1, n - 1) 結束的路徑。有效路徑 不需要是最短路徑 。

你可以花費 cost = 1 的代價修改一個格子中的數字,但每個格子中的數字 只能修改一次

請你返回讓網格圖至少有一條有效路徑的最小代價

示例 1:

輸入:grid = [[1,1,1,1],[2,2,2,2],[1,1,1,1],[2,2,2,2]] 輸出:3 解釋:你將從點 (0, 0) 出發。 到達 (3, 3) 的路徑為: (0, 0) --> (0, 1) --> (0, 2) --> (0, 3) 花費代價 cost = 1 使方向向下 --> (1, 3) --> (1, 2) --> (1, 1) --> (1, 0) 花費代價 cost = 1 使方向向下 --> (2, 0) --> (2, 1) --> (2, 2) --> (2, 3) 花費代價 cost = 1 使方向向下 --> (3, 3) 總花費為 cost = 3.

示例 2:

輸入:grid = [[1,1,3],[3,2,2],[1,1,4]] 輸出:0 解釋:不修改任何數字你就可以從 (0, 0) 到達 (2, 2) 。

示例 3:

輸入:grid = [[1,2],[4,3]] 輸出:1示例 4: 輸入:grid = [[2,2,2],[2,2,2]] 輸出:3示例 5: 輸入:grid = [[4]] 輸出:0提示: m == grid.length n == grid[i].length 1 <= m, n <= 100

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/minimum-cost-to-make-at-least-one-valid-path-in-a-grid
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

2. 解題

  • BFS廣度優先搜索,最短路徑
  • 將箭頭可以走到的地方全部加入隊列,并標記訪問過
  • 然后將隊列里的取出,向4個方向反轉路徑,并一路添加新的沒訪問的可走點
class Solution { public:int minCost(vector<vector<int>>& grid) {int m = grid.size(), n= grid[0].size();int i, j, x = 0, y = 0, a, b, k, flip = 0, size;vector<vector<int>> dir = {{0,0},{0,1},{0,-1},{1,0},{-1,0}};vector<vector<bool>> visited(m,vector<bool>(n,false));queue<pair<int,int>> q;while(x>=0 && x<m && y>=0 && y<n && !visited[x][y]){q.push({x,y});visited[x][y] = true;i = x + dir[grid[x][y]][0];j = y + dir[grid[x][y]][1];x = i, y = j;}if(visited[m-1][n-1])return 0;while(!q.empty()){size = q.size();flip++;while(size--){i = q.front().first;j = q.front().second;q.pop();for(k = 1; k <= 4; k++){x = i + dir[k][0];y = j + dir[k][1];while(x>=0 && x<m && y>=0 && y<n && !visited[x][y]){q.push({x,y});visited[x][y] = true;a = x + dir[grid[x][y]][0];b = y + dir[grid[x][y]][1];x = a, y = b;}}}if(visited[m-1][n-1])return flip;}return flip;} };

總結

以上是生活随笔為你收集整理的LeetCode 1368. 使网格图至少有一条有效路径的最小代价(BFS最短路径,难)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。