双端BFS
在bfs的过程中,如果当前枚举的点是终点则直接返回。否则我们需要枚举它周围的四个点,如果周围有点不存在箱子且也未访问过,则说明到旁边这个点需要移除的箱子数和到达这个点要移除的箱子数量是一样的,这时我们不能把它加入队尾,应当加入队头,这实质上就是bfs中二段性的体现,到达这两个点的代价是一样的所以需要放在同一层次来bfs,所以加入队头。故此需要选用双端队列来进行bfs。
class Solution {
public:
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
int minimumObstacles(vector<vector<int>>& grid) {
int n=grid.size(),m=grid[0].size();
vector<vector<int>> vis(n,vector<int>(m,0));
deque<tuple<int,int,int>> q;
if(grid[0][0]) q.push_back({0,0,1});
else q.push_back({0,0,0});
vis[0][0]=1;
while(!q.empty()){
auto [x,y,d]=q.front();
q.pop_front();
if(x==n-1&&y==m-1) return d;
for(int i=0;i<4;i++){
int xx=x+dx[i],yy=y+dy[i];
if(xx<0||xx>=n||yy<0||yy>=m||vis[xx][yy]) continue;
if(grid[xx][yy]) q.push_back({xx,yy,d+1}),vis[xx][yy]=1;
else q.push_front({xx,yy,d}),vis[xx][yy]=1;
}
}
return 0;
}
};
时间复杂度:O(nm)
空间复杂度:O(nm)