文章目录
- BFS
- 1.图像渲染
- 2.岛屿数量
BFS
1.图像渲染
思路:BFS宽度遍历,我们需要对初始像素进行一层一层遍历,也就是上下左右四个方向进行遍历判断,如何访问这四个方向呢,就需要利用两个数组dx和dy来进行判断和遍历,dx[4]={1,-1,0,0},dy[4]={0,0,1,-1},这四个方向数任意两个组合就会是初始像素点的四个方向。
代码实现:
class Solution {
public:
typedef pair<int,int> PII;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) {
int prev=image[sr][sc];
int m=image.size();
int n=image[0].size();
if(image[sr][sc]==color) return image;
queue<PII> q;
q.push({sr,sc});
while(q.size())
{
auto [a,b]=q.front();
q.pop();
image[a][b]=color;
for(int i=0;i<4;i++)
{
int x=a+dx[i],y=b+dy[i];
if(x>=0&&x<m&&y>=0&&y<n&&prev==image[x][y])
{
q.push({x,y});
}
}
}
return image;
}
};
2.岛屿数量
这个题在于我们知道‘1’代表陆地,‘0’代表海洋,所以我们之间确认岛屿的方法也就是不能连接的陆地。
思路:利用一个bool数组,如果grid中的数据为‘1’,且bool数组这个位置为false,那么岛屿数量就+1,而且调用bfs函数遍历周围的四个位置,并将为‘1’位置的bool数组的数据变成true。
代码实现:
class Solution {
int m,n;
bool vis[301][301];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
public:
int numIslands(vector<vector<char>>& grid) {
m=grid.size(),n=grid[0].size();
int ret=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(grid[i][j]=='1'&&!vis[i][j])
{
ret++;
bfs(grid,i,j);
}
}
}
return ret;
}
void bfs(vector<vector<char>>& grid,int i,int j)
{
queue<pair<int,int>> q;
q.push({i,j});
vis[i][j]=true;
while(q.size())
{
auto [a,b]=q.front();
q.pop();
for(int k=0;k<4;k++)
{
int x=a+dx[k],y=b+dy[k];
if(x>=0&&x<m&&y>=0&&y<n&&grid[x][y]=='1'&&!vis[x][y])
{
q.push({x,y});
vis[x][y]=true;
}
}
}
}
};