题目:1020. 飞地的数量
思路
代码
Method 1:深度优先搜索,我写的
class Solution {
private:
int dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
int result = 0, island = 0;
// island 一个岛上的数量
bool choice;
void function(vector<vector<int>>& grid, vector<vector<bool>>& visited, int x, int y)
{
int i, j;
int m = grid.size(), n = grid[0].size();
int next_x, next_y;
// 这里递归结束条件其实可以不用写
// if()
for(i = 0; i < 4; i++)
{
next_x = x + dir[i][0];
next_y = y + dir[i][1];
// 检查是否还在框框里
if(next_x < 0 || next_x >= m || next_y < 0 || next_y >= n)
{
choice = false;
continue;
}
if(!visited[next_x][next_y] && grid[next_x][next_y] == 1)
{
island++;
visited[next_x][next_y] = true;
function(grid, visited, next_x, next_y);
}
}
}
public:
int numEnclaves(vector<vector<int>>& grid) {
int i, j;
int m = grid.size(), n = grid[0].size();
vector<vector<bool>> visited(m, vector<bool>(n, false));
for(i = 0; i < m; i++)
{
for(j = 0; j < n; j++)
{
if(!visited[i][j] && grid[i][j] == 1)
{
visited[i][j] = true;
island = 1;
choice = true;
function(grid, visited, i, j);
if(choice)
{
result += island;
}
// cout << "hello ! ";
}
}
}
return result;
}
};
如果在遍历中,发现一下步会越界,那么就断定这个岛不需要参与统计,否则,将该岛上的格子数量统计下来;
注意:不是写全局变量的话,传递需要保留的参数时,比如visited[][]
,需要在函数头那里写vector<vector<bool>>& visited
;
Method 2 :深度优先搜索,代码随想录
将和边界相邻的岛屿全部设置为0
,与海洋融为一体,再统计剩余岛上的格子数;