Problem: 1020. 飞地的数量
思路
第一遍将四周的边1 变为 海0, 第二次遍历数个数
Code
class Solution {
public:
int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 代表上下左右 四个方向
int count;
void dfs(vector<vector<int>>& grid, int x, int y) {
grid[x][y] = 0;
++count;
for(int i = 0; i < 4; ++i){
int nextX = x + dir[i][0];
int nextY = y + dir[i][1];
if(nextX < 0 || nextX >= grid.size() || nextY < 0 || nextY >= grid[0].size())
continue;
if(grid[nextX][nextY] == 1){
grid[nextX][nextY] = 0;
dfs(grid,nextX, nextY);
}
}
}
int numEnclaves(vector<vector<int>>& grid) {
int n = grid.size(), m = grid[0].size();
// vector<vector<bool>> visited = vector<vector<bool>>(n, vector<bool>(m, false));
// visited数组不用添加, 因为一定要遍历两边, 且第一遍遍历到的, 第二遍不会遍历到
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){ // 第一遍将四周的边1 变为 海0
if(grid[i][j] == 1){
dfs(grid, i, j);
}
}
}
}
count = 0;
for(int i = 0; i < n; ++i){
for(int j = 0; j < m; ++j){
if(grid[i][j] == 1){
++count; // 第二次遍历数个数
}
}
}
return count;
}
};