LeetCode 417. 太平洋大西洋水流问题--BFS

  1. 太平洋大西洋水流问题

给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度。“太平洋”处于大陆的左边界和上边界,而“大西洋”处于大陆的右边界和下边界。

规定水流只能按照上、下、左、右四个方向流动,且只能从高到低或者在同等高度上流动。

请找出那些水流既可以流动到“太平洋”,又能流动到“大西洋”的陆地单元的坐标。

提示:

输出坐标的顺序不重要
m 和 n 都小于150

示例:

给定下面的 5x5 矩阵:

太平洋 ~ ~ ~ ~ ~
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]] (上图中带括号的单元).

题解

分别从太平洋和大西洋反向遍历整个地图,如果一些位置被遍历两次,说明可以同时流入太平洋和大西洋。

AC代码

class Solution {
public:
    struct Node
    {
        int x,y,val;
    };
    queue<Node>q;
    int xx[4]={0,0,-1,1};
    int yy[4]={-1,1,0,0};
    int vis[205][205];
    bool cis[205][205];
    void bfs(vector<vector<int>>& heights)
    {
        memset(cis,0,sizeof(cis));
        while(!q.empty())
        {
            Node t=q.front();
            q.pop();
            for(int i=0;i<4;i++)
            {
                Node w;
                w.x=t.x+xx[i];
                w.y=t.y+yy[i];
                if(w.x<1||w.x>heights.size()||w.y<1||w.y>heights[0].size())
                continue;
                if(cis[w.x][w.y])continue;
                if(heights[w.x-1][w.y-1]<t.val)continue;
                w.val=heights[w.x-1][w.y-1];
                cis[w.x][w.y]=true;
                vis[w.x][w.y]++;
                q.push(w);
            }
        }
    }
    vector<vector<int>>res;
    vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {
        memset(vis,0,sizeof(vis));
        
        //遍历太平洋
        while(!q.empty())q.pop();
        for(int i=1;i<=heights.size();i++)
        {
            Node t;
            t.x=i,t.y=0,t.val=-1;
            q.push(t);
        }
        for(int i=1;i<=heights[0].size();i++)
        {
            Node t;
            t.x=0,t.y=i,t.val=-1;
            q.push(t);
        }
        bfs(heights);

        //遍历大西洋
        while(!q.empty())q.pop();
        for(int i=1;i<=heights.size();i++)
        {
            Node t;
            t.x=i,t.y=heights[0].size()+1,t.val=-1;
            q.push(t);
        }
        for(int i=1;i<=heights[0].size();i++)
        {
            Node t;
            t.x=heights.size()+1,t.y=i,t.val=-1;
            q.push(t);
        }
        bfs(heights);
        for(int i=1;i<=heights.size();i++)
        {
            for(int j=1;j<=heights[0].size();j++)
            {
                if(vis[i][j]==2)
                {
                    vector<int>t;
                    t.push_back(i-1);
                    t.push_back(j-1);
                    res.push_back(t);
                }
            }
        }
        return res;
    }
};

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值