給你一個 m * n 的網格,其中每個單元格不是 0(空)就是 1(障礙物)。每一步,您都可以在空白單元格中上、下、左、右移動。
如果您 最多 可以消除 k 個障礙物,請找出從左上角 (0, 0) 到右下角 (m-1, n-1) 的最短路徑,並返回通過該路徑所需的步數。如果找不到這樣的路徑,則返回 -1。
解題思路是BFS,每遇到一個障礙物,就看當前還有沒有機會越過障礙物。第一次寫的時候沒有考慮到每個格子的狀態其實不僅僅是一個的,因為達到當前格子走過的障礙物數目是不同的,所以vis要增加一維保存
走到當前格子,總共經過多少個障礙物了。其次格子的狀態數目是有限制的,最多是n*m,注意這一條件,不然死循環了。
最后代碼如下:
class Solution { public: struct T{ int x,y; int step; int k; }; queue<T>q; int dx[4]={-1,1,0,0}; int dy[4]={0,0,1,-1}; bool vis[41][41][41*41]; int bfs(vector<vector<int>>& grid,int m,int n,int k) { memset(vis,0,sizeof(vis)); T init; init.x=0;init.y=0; init.step=0;init.k=0; vis[0][0][0]=1; q.push(init); while(!q.empty()) { T tmp=q.front(); if(tmp.x==m-1&&tmp.y==n-1) return tmp.step; q.pop(); for(int i=0;i<4;i++) { int xx=tmp.x+dx[i]; int yy=tmp.y+dy[i]; if(xx>=0&&xx<m&&yy>=0&&yy<n) { if(grid[xx][yy]==1&&tmp.k+1<=k&&!vis[xx][yy][tmp.k+1]&&tmp.k+1<=n*m) { //cout<<"ww: "<<xx<<" "<<yy<<" "<<tmp.k+1<<endl; vis[xx][yy][tmp.k+1]=1; T tp; tp.k=tmp.k+1; tp.step=tmp.step+1; tp.x=xx; tp.y=yy; q.push(tp); } else if(grid[xx][yy]==0&&tmp.k<=n*m&&!vis[xx][yy][tmp.k]) { vis[xx][yy][tmp.k]=1; T tp; tp.k=tmp.k; tp.step=tmp.step+1; tp.x=xx; tp.y=yy; q.push(tp); } } } } return -1; } int shortestPath(vector<vector<int>>& grid, int k) { int m=grid.size(); int n=grid[0].size(); return bfs(grid,m,n,k); } };