思路1:BFS
- 此题为经典DFS、经典BFS问题
 - 从低往高,从边缘往中间进行搜索LC417. 太平洋大西洋水流问题
 - 这个解法是参考了大佬的,亮点主要包括以下几点: 
- 利用
|= 1; |= 2这样的手段去记录状态矩阵,非常简洁 - BFS的起始点设置了很多个,这样可以加快遍历速度
 - 利用状态矩阵前后数值是否一致,去判断是否需要加入队列(在加入队列的时候设置去重的检验)
 - 将
valid(x, y)函数独立到外部,写法简洁易懂。
代码1:BFS
 
 
class Solution {public:    int dx[4] = {0, 1, -1, 0};    int dy[4] = {1, 0, 0, -1};    bool valid(int x, int y, int row, int col) {        if (x < 0 || x >= row) {            return false;        }        if (y < 0 || y >= col) {            return false;        }        return true;    }    vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {        int row = heights.size(), col = heights[0].size();        vector<vector<int>> rec(row, vector<int>(col, 0));        queue<pair<int, int>> q;        // 初始队列需要放进去很多东西,同时,需要在入队时设置矩阵状态,避免重复遍历        for (int i = 0; i < row; ++i) {            q.push(make_pair(i, 0));            rec[i][0] |= 1;            q.push(make_pair(i, col - 1));            rec[i][col - 1] |= 2;        }        // p:01   A:10        // 重复放也不要怕,进入队列的时候有去重的检验手段了        for (int i = 0; i < col; ++i) {            q.push(make_pair(0, i));            rec[0][i] |= 1;            q.push(make_pair(row - 1, i));            rec[row - 1][i] |= 2;        }        while (!q.empty()) {            pair<int, int> cur_node = q.front();            q.pop();            int cur_x = cur_node.first, cur_y = cur_node.second;            for (int i = 0; i < 4; ++i) {                int nxt_x = cur_x + dx[i], nxt_y = cur_y + dy[i];                if (!valid(nxt_x, nxt_y, row, col)) {                    continue;                }                if (heights[nxt_x][nxt_y] < heights[cur_x][cur_y]) {                    continue;                }                // 说明已经访问过了                if (rec[nxt_x][nxt_y] == rec[cur_x][cur_y]) {                    continue;                }                q.push(make_pair(nxt_x, nxt_y));                rec[nxt_x][nxt_y] |= rec[cur_x][cur_y];            }        }        vector<vector<int>> ans;        for (int i = 0; i < row; ++i) {            for (int j = 0; j < col; ++j) {                // P:01 A:10 both:11                if (rec[i][j] == 3) {                    ans.push_back({i, j});                }            }        }        return ans;    }};
思路2:DFS todo