其他分享
首页 > 其他分享> > 417. 太平洋大西洋水流问题(BFS)

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]]

 

提示:

  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