1020. 飞地的数量(200题差不多)
给你一个大小为 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; } };