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.lengthn == grid[i].length1 <= n <= 100grid[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;
};