[路飞]_js算法:leetcode 109-二进制矩阵中的最短路径

168 阅读1分钟

leetcode 1091. 二进制矩阵中的最短路径

问题描述: 给你一个 n x n 的二进制矩阵 grid 中,返回矩阵中最短 畅通路径 的长度。如果不存在这样的路径,返回 -1 。

二进制矩阵中的 畅通路径 是一条从 左上角 单元格(即,(0, 0))到 右下角 单元格(即,(n - 1, n - 1))的路径,该路径同时满足下述要求:

  • 路径途经的所有单元格都的值都是 0 。
  • 路径中所有相邻的单元格应当在 8 个方向之一 上连通(即,相邻两单元之间彼此不同且共享一条边或者一个角)。

畅通路径的长度 是该路径途经的单元格总数。

示例 1:

输入: grid = [[0,1],[1,0]]
输出: 2

示例 2:

输入: grid = [[0,0,0],[1,1,0],[1,1,0]]
输出: 4

示例 3:

输入: grid = [[1,0,0],[1,1,0],[1,1,0]]
输出: -1

提示:

  • n == grid.length
  • n == grid[i].length
  • 1 <= n <= 100
  • grid[i][j] 为 0 或 1

思路: 广度优先遍历

/**
 * @param {number[][]} grid
 * @return {number}
 */
 //设计数据状态
function Data(i,j,k){
  this.i=i||0;
  this.j=j||0;
  this.k=k||0;
}
 var shortestPathBinaryMatrix = function(grid) {
   let m=grid.length;
   let queue=[];
   let vis=[]
    for(let i=0;i<m;i++){
    vis.push(new Array(m).fill(0))
  }
   if(grid[0][0])return -1;
   vis[0][0]=1;
   queue.push(new Data(0,0,1));//左上角开始走一步
  let vec=[[0,1],[1,0],[0,-1],[-1,0],[1,-1],[-1,1],[1,1],[-1,-1]]
   while(queue.length>0){
     let cur=queue[0];
      if(cur.i==m-1&&cur.j==m-1)return cur.k;//最后一个节点
     for(let vc=0;vc<vec.length;vc++){
       let x=cur.i+vec[vc][0];
       let y=cur.j+vec[vc][1];
       if(x<0||x>=m)continue;
       if(y<0||y>=m)continue;
       if(grid[x][y])continue;
       if(vis[x][y])continue;
       vis[x][y]=1;
       queue.push(new Data(x,y,cur.k+1))//找到八个方向中合理的点走
     }
     queue.shift()

   }
   return -1;

};