• Leetcode 1020 飞地的数量


    地址 https://leetcode-cn.com/problems/number-of-enclaves/

    给出一个二维数组 A,每个单元格为 0(代表海)或 1(代表陆地)。

    移动是指在陆地上从一个地方走到另一个地方(朝四个方向之一)或离开网格的边界。

    返回网格中无法在任意次数的移动中离开网格边界的陆地单元格的数量。

    示例 1:
    
    输入:[[0,0,0,0],[1,0,1,0],[0,1,1,0],[0,0,0,0]]
    输出:3
    解释: 
    有三个 10 包围。一个 1 没有被包围,因为它在边界上。
    示例 2:
    
    输入:[[0,1,1,0],[0,0,1,0],[0,0,1,0],[0,0,0,0]]
    输出:0
    解释:
    所有 1 都在边界上或可以到达边界。
     
    
    提示:
    
    1 <= A.length <= 500
    1 <= A[i].length <= 500
    0 <= A[i][j] <= 1
    所有行的大小都相同

    这题目和之前的

    POJ 2386 Lake Counting

    poj 1979 Red and Black

    基本一致  可以使用并查集和DFS完成

    这里就换个思路 给个BFS版本 不过提交 就tle了 仅仅是提供个答案外的思路

    class Solution {
    public:
        int numEnclaves(vector<vector<int>>& A) {
            if (A.empty()) return 0;
            int n = A.size();
            int m = A[0].size();
            int ret = 0;
    
            
            for (int i = 0; i < n; i++) {
                for (int  j = 0; j < m; j++) {
                    if (i == 0 || i == ( n - 1) || j == 0 || j == (m - 1)) {
                        if(A[i][j] ==1)
                            bfs(A, i, j);
                    }
                }
            }
    
    
            for (int i = 1; i < n; i++) {
                for (int j = 1; j < m; j++) {
                    if (A[i][j] == 1) {
                        ret++;
                    }
                }
            }
    
            return ret;
        }
    
    private:
        int bfs(vector<vector<int>>& A, int i, int j) {
            int cnt = 0;
            queue<vector<int>> que;
            que.push({ i, j });
            int di[] = { 0, 0, 1, -1 };
            int dj[] = { 1, -1, 0, 0 };
    
            while (!que.empty()) {
                vector<int> cur(que.front());
                que.pop();
                cnt++;
                A[cur[0]][cur[1]] = 0;
    
                for (int k = 0; k < 4; k++) {
                    int ni = cur[0] + di[k];
                    int nj = cur[1] + dj[k];
    
                    if (valid(ni, nj, A.size(), A[0].size()) && A[ni][nj] == 1) {
                        que.push({ ni, nj });
                    }
                }
            }
            return cnt;
        }
    
    
        bool valid(int i, int j, int n, int m) {
            return (i >= 0 && i < n && j >= 0 && j < m);
        }
    };

    ac code:

     1 class Solution {
     2 public:
     3     int addx[4]; int addy[4];
     4     
     5     void Dfs(vector<vector<int>>& A,int x ,int y)
     6     {
     7         if( x <0 || x>= A.size() || y <0 || y >= A[0].size()) return;
     8         
     9         A[x][y] = 0;
    10         
    11         for(int i = 0 ;i <4;i++){
    12             int newx = x + addx[i];
    13             int newy = y + addy[i];
    14             
    15             if(newx>=0 && newx < A.size() && newy >=0 && newy< A[0].size() && A[newx][newy] == 1)
    16                 Dfs(A,newx,newy);
    17         }
    18         
    19     }
    20     
    21     int numEnclaves(vector<vector<int>>& A) {
    22         if(A.empty() || A[0].empty()) return 0;
    23         addx[0] = -1;addx[1] = 1; addx[2] = 0;addx[3] = 0;
    24         addy[0] = 0;addy[1] = 0; addy[2] = -1;addy[3] = 1;
    25         for(int i = 0;i<A.size();++i){
    26             for(int j = 0; j< A[0].size();++j){
    27                 if(i == 0 || i == A.size()-1 ||  j == 0 || j == A[0].size()-1 ){
    28                     if(A[i][j] == 1){
    29                         //边缘的元素 并且== 1
    30                         Dfs(A,i,j);
    31                     }
    32                 }   
    33             }
    34         }    
    35         
    36         int count = 0;
    37         for(int i = 0;i<A.size();++i){
    38             for(int j = 0; j< A[0].size();++j){
    39                 if(A[i][j] == 1) count++;
    40             }
    41         }    
    42         
    43         
    44         return count;
    45     }
    46 };
    View Code

    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    一些精简的小技巧
    POJ题目分类(转)
    【慢慢学算法】:连通图
    【菜鸟做水题】: 杭电1004
    杭电ACM试题分类,一步一个脚印!(转)
    【慢慢学Android】:获得当前时间
    【慢慢学算法】:小白鼠排队
    【慢慢学Android】:12.Notification示例
    【慢慢学Android】:13.打电话代码
    “/”应用程序中的服务器错误。
  • 原文地址:https://www.cnblogs.com/itdef/p/11976536.html
Copyright © 2020-2023  润新知