题意
给定一个矩阵,0代表空地,1代表障碍物,要求移除最少的障碍物使可以从左上角走到右下角
思路
BFS,将0和1看作走过格子的代价,相当于走到右下角用的最少代价。走到1的格子放到队列最后,0的放到最前,这样对于一个格子走到他所计算的代价一定是最小的。
说是01BFS的模板题,我怎么以前没听过这个算法哈哈哈哈,是题刷少了吗
class Solution {
public:
struct node{
int x,y;
};
int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
int minimumObstacles(vector<vector<int>>& grid) {
int n=grid.size();
int m=grid[0].size();
vector<vector<int>> dis(n, vector<int>(m, INT_MAX));
deque<node>q;
q.push_front(node{0,0});
dis[0][0]=0;
while(q.size()) {
auto u = q.front();
q.pop_front();
int x=u.x;
int y=u.y;
for(int i=0;i<4;i++) {
int tx = x+dir[i][0];
int ty = y+dir[i][1];
if(tx>=0&&ty>=0&&tx<n&&ty<m&&dis[tx][ty]==INT_MAX) {
dis[tx][ty] = dis[x][y]+grid[tx][ty];
if(grid[tx][ty]) q.push_back(node{tx,ty});
else q.push_front(node{tx,ty});
}
}
}
return dis[n-1][m-1];
}
};