BFS
用数组vis[i][j][t]来表示经过(i,j)时,消除了t个障碍物的最短路径。
用vis来记录状态跑BFS即可。
class Solution {
public:
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
int shortestPath(vector<vector<int>>& grid, int k) {
int n=grid.size(),m=grid[0].size();
queue<tuple<int,int,int>> q;
int vis[n][m][k+1];
memset(vis,-1,sizeof vis);
int ans=1e9;
q.push({0,0,grid[0][0]==1});
vis[0][0][grid[0][0]==1]=0;
while(!q.empty()){
auto [x,y,t]=q.front();
q.pop();
if(x==n-1&&y==m-1) ans=min(ans,vis[x][y][t]);
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) continue;
int tt=t+(grid[xx][yy]==1);
if(tt>k) continue;
if(vis[xx][yy][tt]==-1){
vis[xx][yy][tt]=vis[x][y][t]+1;
q.push({xx,yy,tt});
}
}
}
return ans==(int)1e9?-1:ans;
}
};
时间复杂度:O(nm)。
空间复杂度:O(nmk)。

本文介绍了一种使用BFS算法解决特定路径寻找问题的方法。通过定义三维数组vis来记录状态,并利用队列q进行广度优先搜索,实现了在给定网格中寻找从起点到终点消除k个障碍物的最短路径。算法的时间复杂度为O(nm),空间复杂度为O(nmk)。
544

被折叠的 条评论
为什么被折叠?



