1020. 飞地的数量
题目链接:1020. 飞地的数量
代码如下:
class Solution
{
public:
int numEnclaves(vector<vector<int>>& grid)
{
//从左边和右边向中间遍历
for(int i=0;i<grid.size();i++)
{
if(grid[i][0]==1)
{
// dfs(grid,i,0);
bfs(grid,i,0);
}
if(grid[i][grid[0].size()-1]==1)
{
// dfs(grid,i,grid[0].size()-1);
bfs(grid,i,grid[0].size()-1);
}
}
//从上边边和下边边向中间遍历
for(int j=0;j<grid[0].size();j++)
{
if(grid[0][j]==1)
{
// dfs(grid,0,j);
bfs(grid,0,j);
}
if(grid[grid.size()-1][j]==1)
{
// dfs(grid,grid.size()-1,j);
bfs(grid,grid.size()-1,j);
}
}
count=0;
for(int i=0;i<grid.size();i++)
{
for(int j=0;j<grid[0].size();j++)
{
if(grid[i][j]==1)
{
// dfs(grid,i,j);
bfs(grid,i,j);
}
}
}
return 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]==0) continue;
// dfs(grid,nextX,nextY);
// }
// }
//广度优先搜索
void bfs(vector<vector<int>>& grid,int x,int y)
{
queue<pair<int,int>> que;
que.push({x,y});
grid[x][y]=0;// 只要加入队列,立刻标记
count++;
while(!que.empty())
{
auto cur=que.front();
que.pop();
for(int i=0;i<4;i++)
{
int nextX=cur.first+dir[i][0];
int nextY=cur.second+dir[i][1];
if(nextX<0||nextX>=grid.size()||nextY<0||nextY>=grid[0].size())
continue;
if(grid[nextX][nextY]==1)
{
que.push({nextX,nextY});
count++;
grid[nextX][nextY]=0;
}
}
}
}
private:
int dir[4][2] = {-1,0,0,-1,1,0,0,1}; // 保存四个方向
int count; // 统计符合题目要求的陆地空格数量
};