【資料結構】二進位制矩陣中的最短路徑 Shortest Path In Binary Matrix
阿新 • • 發佈:2021-10-05
目錄
二進位制矩陣中的最短路徑 Shortest Path In Binary Matrix
給定一個N*N
矩陣grid,返回一個最短路徑,如果沒有就返回-1;
最短路徑:從grid的左上角[0,0]開始,直到右下角[n-1,n-1],所有路徑上的點必須是0,
路徑可以是上下左右,還可以是左上左下,右上右下。
grid = [[0,1],[1,0]]
out:2
思路
grid
是一個N*N
階矩陣,要求輸出最短路徑。
使用BFS
,將grid左上角0元素座標資訊入隊。並且使用一個visit二維陣列記錄結果,-1代表未訪問過,0代表訪問過.
佇列中使用陣列維護已經遍歷的座標資訊 {x,y,val},代表行,列,節點的最短路徑
在進行BFS
過程中,每出隊一個座標,就對該座標進行方向擴充套件,即尋找附近的元素座標。直到走到右下角,或者無法找到最短路徑返回-1。
public int shortestPathBinaryMatrix(int[][] grid) { int n = grid.length; int m = grid[0].length; int[][] visit = new int[n][m]; if (grid[0][0]==1){ return -1; } Queue<int[]> queue = new LinkedList<int[]>(); int[][] dir = {{1,0},{-1,0},{0,1},{0,-1},{-1,-1},{-1,1},{1,1},{1,-1}}; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(grid[i][j]==0){ visit[i][j]= -1; } } } queue.offer(new int[]{0,0,1}); visit[0][0]=1; int ans =0; while(!queue.isEmpty()){ int[] t = queue.peek(); if(t[0]==n-1&&t[1]==m-1){ return t[2]; } for(int k = 0;k<8;k++){ int x = t[0]+dir[k][0]; int y = t[1]+dir[k][1]; if(x<0||x>=n){ continue; } if(y<0||y>=m){ continue; } if(grid[x][y]==1){ continue; } if(visit[x][y] ==1){ continue; } ans = t[2]+1; visit[x][y]=1; queue.offer(new int[]{x,y,ans}); } queue.poll(); } return -1; }
Tag
BFS