【DFS 待优化】 417. 太平洋大西洋水流问题

class Solution {
public:

    bool is_get(int x, int y){
        if(x >= 0 && x < len_x && y >= 0 && y < len_y)
            return true;
        return false;
    }

    int dfs(vector<vector<int>>& heights, vector<vector<int>>& result, vector<vector<bool>>& record, vector<vector<bool>>& is_add, int x, int y, int flag){
        if(x == 0 || y == 0)
            flag |= 1;
        if(x == len_x - 1 || y == len_y - 1)
            flag |= 2;
        record[x][y] = true;
        for(int i=0;i<4;++i){
            int target_x = x + dir[i][0];
            int target_y = y + dir[i][1];
            if(is_get(target_x, target_y) 
            && record[target_x][target_y] == false){
                if(heights[x][y] >= heights[target_x][target_y]){
                    if (is_add[target_x][target_y]){
                        flag = 3;
                        break;
                    }
                    flag =  flag | dfs(heights, result, record, is_add, target_x, target_y, 0);
                }
            }
        }
        if(!is_add[x][y] && flag == 3){
            is_add[x][y] = true;
            result.push_back({x , y});
        }
        record[x][y] = false;
        return flag;
    }

    vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {
        len_x = heights.size();
        len_y = heights[0].size();
        vector<vector<int>> result;
        vector<vector<bool>> is_add(len_x, vector<bool>(len_y, false));
        vector<vector<bool>> record(len_x, vector<bool>(len_y, false));
        for(int i=0;i<len_x;++i)
            for(int j=0;j<len_y;++j){
                if(!is_add[i][j])
                    dfs(heights, result, record, is_add, i, j, 0);
            }
        return result;
    }
private:
    int len_x;
    int len_y;
    int dir[4][2] = {
        {1,0},
        {-1,0},
        {0,1},
        {0,-1}
    };
};
posted @ 2022-03-01 14:15  fwx  阅读(14)  评论(0)    收藏  举报