LeetCode 1368. 使网格图至少有一条有效路径的最小代价【最短路】

传送门

题解

题目说可以花费代价 \(1\) 调整方向,换个意思就是说,
如果沿着原方向走,代价为 \(0\),否则代价为 \(1\),求从点 \((0,0)\) 到点 \((n-1,m-1)\) 的最小代价,
这其实就是个最短路问题了,可以直接上Dijkstra。
然而这个也可以用BFS直接解决,把queue换成deque,然后沿0边走的点放到队头,沿1边走的点放到队尾,这样BFS出来也是最短路。

代码

class Solution {
public:
    int n,m,f[110][110],dis[110][110],vis[110][110];
    int d[5][2]={{},{0,1},{0,-1},{1,0},{-1,0}};
    struct Turp{
        int x,y,w;
        friend bool operator < (const Turp &a,const Turp &b){
            return a.w>b.w;
        }
    };
    priority_queue<Turp> pq;
    
    int minCost(vector<vector<int>>& grid) {
        n=grid.size(),m=grid[0].size();
        memset(dis,0x3f,sizeof(dis));
        dis[0][0]=0;
        pq.push((Turp){0,0,0});
        while(!pq.empty()){
            int ux=pq.top().x,uy=pq.top().y;pq.pop();
            if(vis[ux][uy]) continue;
            vis[ux][uy]=1;
            for(int i=1;i<=4;i++){
                int vx=ux+d[i][0],vy=uy+d[i][1],len=(i!=grid[ux][uy]);
                if(vx<0||vx==n||vy<0||vy==m) continue;
                if(dis[vx][vy]>dis[ux][uy]+len){
                    dis[vx][vy]=dis[ux][uy]+len;
                    pq.push((Turp){vx,vy,dis[vx][vy]});
                }
            }
        }
        return dis[n-1][m-1];
    }
};
posted @ 2020-03-05 16:46  BakaCirno  阅读(160)  评论(0编辑  收藏  举报