1020. 飞地的数量(200题差不多)

 

labuladong 题解思路
难度中等

给你一个大小为 m x n 的二进制矩阵 grid ,其中 0 表示一个海洋单元格、1 表示一个陆地单元格。

一次 移动 是指从一个陆地单元格走到另一个相邻(上、下、左、右)的陆地单元格或跨过 grid 的边界。

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

 

示例 1:

输入:grid = [[0,0,0,0],[1,0,1,0],[0,1,1,0],[0,0,0,0]]
输出:3
解释:有三个 1 被 0 包围。一个 1 没有被包围,因为它在边界上。

示例 2:

输入:grid = [[0,1,1,0],[0,0,1,0],[0,0,1,0],[0,0,0,0]]
输出:0
解释:所有 1 都在边界上或可以到达边界。
 
 
class Solution {
public:
    vector<vector<int>> dirs = {{1,0},{-1,0},{0,1},{0,-1}};
    void dfs(int i, int j, vector<vector<int>>& grid) {
        if( i<0 || i>=grid.size() || j<0 || j >= grid[0].size()) {
            return;
        }
        if (grid[i][j] == 0) {
            return;
        }
        grid[i][j] = 0;
        for(auto ch : dirs) {
            dfs(i+ch[0],j+ch[1],grid);
        }
    }
    int numEnclaves(vector<vector<int>>& grid) {
        //找到边界上的1,
        // 从边界上的1开始遍历岛屿,淹掉
        // 遍历剩下1的方格的数量

        for(int i = 0;i < grid.size();i++) {
            if(grid[i][0]==1) dfs(i,0,grid);
        }
    
        for(int i = 0;i < grid.size();i++) {
            int j = grid[0].size()-1;
            if(grid[i][j]==1) dfs(i,j,grid);
        }

        for(int j = 0;j < grid[0].size();j++) {
            if(grid[0][j]==1) dfs(0,j,grid);
        }
            
        for(int j = 0;j < grid[0].size();j++) {
            int i = grid.size()-1;
            if(grid[i][j]==1) dfs(i,j,grid);
        }
        int cnt = 0;
        for(int i = 0;i < grid.size();i++) {
            for (int j = 0 ; j < grid[0].size();j++) {
                if(grid[i][j]==1) {
                    cnt++;
                }
            }
        }
        return cnt;
    }
};

 

posted @ 2019-01-18 20:03  乐乐章  阅读(134)  评论(0编辑  收藏  举报