题目
给你一个大小为 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 都在边界上或可以到达边界。
解题
方法一:DFS
先计算 网格中所有陆地 的数量
然后 减去与网格边界相连的 陆地数量即可。
例子:红色阴影为矩阵边界,总共陆地4,与边界相邻的陆地1,因此4-1=3
class Solution { public: int numEnclaves(vector<vector<int>>& grid) { int m=grid.size(),n=grid[0].size(); int res=0; vector<pair<int,int>> edge;//存储矩阵的边界陆地的二维坐标 for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if((i==0||i==m-1||j==0||j==n-1)&&grid[i][j]){//矩阵边界的陆地 edge.push_back({i,j}); } res+=grid[i][j];//统计所有陆地 } } for(auto[x,y]:edge){//所有陆地 减去 与矩阵边界相连的陆地 res-=dfs(x,y,grid); } return res; } //从矩阵边缘的陆地开始dfs,统计与矩阵边界相连陆地的大小 int dfs(int x,int y,vector<vector<int>>& grid){ if(x<0||x>=grid.size()||y<0||y>=grid[0].size()||grid[x][y]!=1) return 0; else grid[x][y]=2;//对于访问过的陆地,标记为2 return 1+dfs(x+1,y,grid)+dfs(x-1,y,grid)+dfs(x,y+1,grid)+dfs(x,y-1,grid); } };