ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

417. 太平洋大西洋水流问题(BFS)

2022-05-02 18:04:15  阅读:140  来源: 互联网

标签:yNext 边界 xNext int heights BFS 417 visited 水流


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有