美文网首页
1091.二维矩阵中的最短路径

1091.二维矩阵中的最短路径

作者: HamletSunS | 来源:发表于2019-10-23 23:36 被阅读0次

题目思路:
使用dijkstra算法,因为题目的特殊性,没有必要严格按照dijkstra去执行,可以适当简化,比如我这里并没有设计bool数组去标记S集和U集,因为没必要。也没有用优先队列去装距离。

复习dijkstra算法:
算法目的:
求得 单个定点 到 其余各个点的最短距离
算法步骤:
1.设计S集、U集,S中放已经找到最短路径的点,U集放尚未处理的点
2.设计3个状态集合,dist和useddist存储当前已经找到的从单个定点到其余各个点的最小距离(算法没执行完的话,不一定是最小距离,执行完之后才是),used[i]存储是否已经处理完第i个节点,用来区分是S集还是U集。
3.每次从U集中取出从 单个定点 到U集中的点 路径最短的点,然后以该点为中间节点,更新一遍U集中 其它点的距离。(选U集中的最短路径可以借助优先队列优化算法,用一个最小堆,每次弹出最短距离的顶点,结合used来判断是否作处理)

class Solution {
public:
    int shortestPathBinaryMatrix(vector<vector<int>>& grid) {
        int n=grid.size();
        if(n==0)
            return -1;
        if(grid[0][0]==1)
            return -1;
        dist=vector<int>(n*n,10001);
        row=grid.size();
        col=grid[0].size();
        dijkstra(grid);
        return dist[n*n-1]==10001?-1:dist[n*n-1]+1;
    }
    
private:
    int row,col;
    vector<int> dist;
    bool canMove(int x,int y,vector<vector<int>> &grid){
        return x>=0 && x<row && y>=0 && y<col && grid[x][y]==0;
    };
    void dijkstra(vector<vector<int>> &grid){
        int n=grid.size();
        dist=vector<int>(n*n,10001);//代表从(0,0)到(row,col)的最短距离
        queue<int> qu;
        dist[0]=0;
        
        int d[8][2]={
            {-1,-1},
            {-1,0},
            {-1,1},
            {0,-1},
            {0,1},
            {1,-1},
            {1,0},
            {1,1}
        };
        qu.push(0);
        
        while(!qu.empty()){
            int vex=qu.front();
            qu.pop();
            
            int x=vex/row;
            int y=vex%row;
                
            for(int i=0;i<8;i++){
                int newX=x+d[i][0];
                int newY=y+d[i][1];
                if(canMove(newX,newY,grid)){
                    int point=newX*row+newY;
                    //update the path distance
                    if(dist[point]>dist[vex]+1)
                        {dist[point]=dist[vex]+1;
                         qu.push(point);
                        }                   
                }
            }
        }
    }
};

相关文章

  • 1091.二维矩阵中的最短路径

    题目思路:使用dijkstra算法,因为题目的特殊性,没有必要严格按照dijkstra去执行,可以适当简化,比如我...

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

    这道理也是没有思路的,但是答案很多都说,因为求最短路径,所以可以用BFS(广度优先算法),找了一个思路: 反正这个...

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

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

  • LeetCode #1091 Shortest Path in

    1091 Shortest Path in Binary Matrix 二进制矩阵中的最短路径 Descripti...

  • floyd

    佛洛依德算法: 多源最短路径算法 三人for循环 领接矩阵 一个存最短路径权 一个存路径 逐个顶点试探,加...

  • 动态规划

    二维int数组矩阵从左上角到右上角的最短路径 分割整数n,若干个数的和为n,求若干个数的最大乘积。 最长公共子序列...

  • 数据结构与算法-图的最短路径Dijkstra算法&Floyd算法

    最短路径 最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。在...

  • 算法 | 最短路径问题

    最短路径 最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径,在...

  • 致懒癌:5分钟,学会时间管理的最短有效路径

    什么是最短路径: 最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短...

  • 数据结构-图

    邻接矩阵中的两个最短路径算法,Djkstra,Floyd 以邻接表存储的两种遍历,深度优先遍历和广度优先遍历,类比...

网友评论

      本文标题:1091.二维矩阵中的最短路径

      本文链接:https://www.haomeiwen.com/subject/bykjuctx.html