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驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
阿里打赏 微信打赏
原文地址:https://www.cnblogs.com/itdef/p/11976536.html