题目:https://leetcode-cn.com/problems/number-of-enclaves/
思路:从四条边上的1进行DFS,把与其相连接的1全部置为0,最后剩下的1就都是飞地
class Solution {
public:
//给定索引是否在数组内
bool inArea(vector<vector<int>>& A, int r, int c) {
return r >= 0 && r < A.size() && c >= 0 && c < A[0].size();
}
//把 与当前节点连接的1 全部置0
void dfs(vector<vector<int>>& A, int row, int col) {
if(!inArea(A, row, col)) return;
if(A[row][col] != 1) return;
A[row][col] = 0;
dfs(A, row - 1, col);
dfs(A, row + 1, col);
dfs(A, row, col - 1);
dfs(A, row, col + 1);
}
//数组A中 1 的数量
int nums_of_1(vector<vector<int>>& A) {
int count = 0;
for(int i = 0; i < A.size(); i++) {
for(int j = 0; j < A[0].size(); j++) {
if(A[i][j] == 1)
count++;
}
}
return count;
}
int numEnclaves(vector<vector<int>>& A) {
int m = A.size();
int n = A[0].size();
if(m == 0 || n == 0) return 0;
//遍历左右两条边
for(int i = 0; i < m; i++) {
if(A[i][0] == 1)
dfs(A, i, 0);
if(A[i][n-1] == 1)
dfs(A, i, n-1);
}
//遍历上下两条边
for(int j = 0; j < n; j++) {
if(A[0][j] == 1)
dfs(A, 0, j);
if(A[m-1][j] == 1)
dfs(A, m-1, j);
}
//四条边都遍历完,剩下的 1 就是飞地
return nums_of_1(A);
}
};