1. 程式人生 > 其它 >【資料結構】二進位制矩陣中的最短路徑 Shortest Path In Binary Matrix

【資料結構】二進位制矩陣中的最短路徑 Shortest Path In Binary Matrix

目錄

二進位制矩陣中的最短路徑 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