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];
}
};