417. 太平洋大西洋水流问题(BFS)
作者:互联网
417. 太平洋大西洋水流问题
有一个 m × n
的矩形岛屿,与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界,而 “大西洋” 处于大陆的右边界和下边界。
这个岛被分割成一个由若干方形单元格组成的网格。给定一个 m x n
的整数矩阵 heights
, heights[r][c]
表示坐标 (r, c)
上单元格 高于海平面的高度 。
岛上雨水较多,如果相邻单元格的高度 小于或等于 当前单元格的高度,雨水可以直接向北、南、东、西流向相邻单元格。水可以从海洋附近的任何单元格流入海洋。
返回网格坐标 result
的 2D 列表 ,其中 result[i] = [ri, ci]
表示雨水从单元格 (ri, ci)
流动 既可流向太平洋也可流向大西洋 。
示例 1:
输入: heights = [[1,2,2,3,5],[3,2,3,4,4],[2,4,5,3,1],[6,7,1,4,5],[5,1,1,2,4]] 输出: [[0,4],[1,3],[1,4],[2,2],[3,0],[3,1],[4,0]]
示例 2:
输入: heights = [[2,1],[1,2]] 输出: [[0,0],[0,1],[1,0],[1,1]]
提示:
m == heights.length
n == heights[r].length
1 <= m, n <= 200
0 <= heights[r][c] <= 105
1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 #include <string> 5 #include <unordered_map> 6 #include <unordered_set> 7 #include <queue> 8 using namespace std; 9 10 class Solution { 11 public: 12 /* 题目意思是从任意坐标位置最终可以到达与太平洋(上边界和左边界)和大西洋(右边界和下边界位置) 13 * 1、上、左、右、下边界点均可到达,将所有边界点入队; 14 * 2、以任意边界点为起点进行BFS找到所有与边界连通的点; 15 * 3、返回所有满足条件的坐标; 16 */ 17 // 上、右、下、左四个方向 18 vector<std::pair<int, int>> g_direction = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; 19 void pushToqueue( int x, int y, int mask, queue<std::pair<int, int>> &q, vector<vector<int>> &visited) { 20 visited[x][y] |= (1 << mask); // 根据mask(1-太平洋、2-大西洋)刷新visited 21 q.push(make_pair(x, y)); 22 } 23 // 根据mask标记校验是否与太平洋或大西洋连通 24 bool check(const vector<vector<int>> &visited, int x, int y, int mask) { 25 return ((visited[x][y] & (1 << mask)) != 0); 26 } 27 vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) { 28 vector<vector<int>> ans; 29 if (heights.size() == 0 || heights[0].size() == 0) { 30 return ans; 31 } 32 int row = heights.size(); 33 int col = heights[0].size(); 34 /* visited存储与两个洋连通情况: 35 * 0-表示与两个洋均不连通; 36 * 1-表示与太平洋连通; 37 * 2-表示与大西洋连通; 38 * 3-表示既与太平洋 39 */ 40 vector<vector<int>> visited(row, vector<int>(col, 0)); 41 queue<std::pair<int, int>> q; 42 constexpr int pacificMask = 0; // 0-太平洋 43 constexpr int atlanticMask = 1; // 1-大西洋 44 // 将左边界和右边界点入队 45 for (int i = 0; i < row; i++) { 46 pushToqueue(i, 0, pacificMask, q, visited); // 与太平洋连通 47 pushToqueue(i, col - 1, atlanticMask, q, visited); // 与大西洋连通 48 } 49 // 将上边界和下边界入队 50 for (int j = 0; j < col; j++) { 51 pushToqueue(0, j, pacificMask, q, visited); // 与太平洋连通 52 pushToqueue(row - 1, j, atlanticMask, q, visited); // 与大西洋连通 53 } 54 while (!q.empty()) { 55 int curX = q.front().first; 56 int curY = q.front().second; 57 q.pop(); 58 for (auto &pair : g_direction) { 59 60 int xNext = curX + pair.first; 61 int yNext = curY + pair.second; 62 if (xNext < 0 || xNext >= row || yNext < 0 || yNext >= col) { 63 continue; 64 } 65 if (heights[curX][curY] > heights[xNext][yNext]) { 66 continue; 67 } 68 if (check(visited, curX, curY, pacificMask) && !check(visited, xNext, yNext, pacificMask)) { 69 pushToqueue(xNext, yNext, pacificMask, q, visited); 70 } 71 if (check(visited, curX, curY, atlanticMask) && !check(visited, xNext, yNext, atlanticMask)) { 72 pushToqueue(xNext, yNext, atlanticMask, q, visited); 73 } 74 } 75 } 76 for (int i = 0; i < row; i++) { 77 for (int j = 0; j < col; j++) { 78 if (visited[i][j] == 3) { 79 ans.push_back({i, j}); 80 } 81 } 82 } 83 // 打印输出结果: 84 for (auto &pair : ans) { 85 std::cout << pair[0] << "," << pair[1] << endl; 86 } 87 std::cout << endl; 88 return ans; 89 } 90 }; 91 int main() 92 { 93 /* 94 * 测试用例1: 95 /* 输入:heights = [[1,2,2,3,5],[3,2,3,4,4],[2,4,5,3,1],[6,7,1,4,5],[5,1,1,2,4]] 96 * 期望输出:[[0,4],[1,3],[1,4],[2,2],[3,0],[3,1],[4,0]] 97 */ 98 vector<vector<int>> grid = { 99 {1, 2, 2, 3, 5}, 100 {3, 2, 3, 4, 4}, 101 {2, 4, 5, 3, 1}, 102 {6, 7, 1, 4, 5}, 103 {5, 1, 1, 2, 4}}; 104 Solution *test = new Solution(); 105 test->pacificAtlantic(grid); 106 return 0; 107 }
标签:yNext,边界,xNext,int,heights,BFS,417,visited,水流 来源: https://www.cnblogs.com/MGFangel/p/16216276.html