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)。