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;
    }
};

 

posted @ 2024-02-23 16:03  黑屿白  阅读(30)  评论(0)    收藏  举报