803 打砖块
这道题运用了 逆序思维 的方法。具体看题解区。
code
class Solution { public: int n,m,sum=0; void dfs(vector<vector<int>>& grid,int i,int j){ if (i<0 || i>=n || j<0 || j>=m) return; if (grid[i][j]!=1) return; grid[i][j]=2; sum++; dfs(grid,i+1,j); dfs(grid,i-1,j); dfs(grid,i,j+1); dfs(grid,i,j-1); } vector<int> hitBricks(vector<vector<int>>& grid, vector<vector<int>>& hits) { n=grid.size(); m=grid[0].size(); int cnt=hits.size(); vector<int> a(cnt); for (int i=0;i<cnt;i++){ grid[hits[i][0]][hits[i][1]]-=1; } for (int i=0;i<m;i++) if (grid[0][i]==1) dfs(grid,0,i); for (int i=cnt-1;i>=0;--i){ int fn=hits[i][0],fm=hits[i][1]; grid[fn][fm]+=1; sum=0; if (grid[fn][fm]==1){ if (fn>0 && grid[fn-1][fm]==2) dfs(grid,fn,fm); if (fn<n-1 && grid[fn+1][fm]==2) dfs(grid,fn,fm); if (fm>0 && grid[fn][fm-1]==2) dfs(grid,fn,fm); if (fm<m-1 && grid[fn][fm+1]==2) dfs(grid,fn,fm); if (fn==0) dfs(grid,fn,fm); } a[i]=sum-1<0 ? 0 : sum-1; } return a; } };
浙公网安备 33010602011771号