934 Shortest Bridge
1.题目
1.1解题思路
DFS+BFS
1.首先随机搜索,找到一个岛,然后使用DFS将与这个岛相连通的所有1变成2,并将1旁边的0都收集起来,为下面的步骤做准备。
2.调用BFS,把第一个岛向外扩散,即把它周围的0都改为2,直到找到1,说明已经遇到第二个岛,此时返回扩散的次数level即可。
1.2direction解读
dx[4]={-1,0,1,0};
dy[4]={0,1,0,-1};
合起来direction{-1,0,1,0,-1};
2.代码
class Solution {
public:
//主函数
vector<int> direction{-1,0,1,0,-1};
int shortestBridge(vector<vector<int>>& grid) {
int m=grid.size(),n=grid[0].size();
queue<pair<int,int>> points;//以后存放海洋0的队列
// dfs寻找第一个岛屿,并把1全部赋值为2
bool flipped=false;
for(int i=0;i<m;++i)
{
if(flipped)
break;
for(int j=0;j<n;++j)
{
if(grid[i][j]==1)
{
dfs(points,grid,m,n,i,j);
flipped=true;
break;
}
}
}
//bfs寻找第二个岛屿,并把过程中经过的0赋值为2
int x,y;
int level=0;
while(!points.empty())
{
++level;//最少有1层
int n_points=points.size();//首先是第1层外面的海洋
while(n_points--)
{
auto [r,c]=points.front();//取第一个海洋点
points.pop();
for(int k=0;k<4;++k)
{
x=r+direction[k],y=c+direction[k+1];
if(x>=0&&x<m&&y>=0&&y<n)
{
if(grid[x][y]==2)
continue;
if(grid[x][y]==1)
return level;
points.push({x,y});//第二层海洋加进去
grid[x][y]=2;
}
}
}
}
return 0;
}
//辅函数
void dfs(queue<pair<int,int>>& points,vector<vector<int>>& grid,int m,int n,int i,int j)
{
if(i<0||i>=m||j<0||j>=n||grid[i][j]==2)
return;
if(grid[i][j]==0)
{
points.push({i,j});//找第一层海洋
return;
}
grid[i][j]=2;//dfs寻找第一个岛屿,并把1全部赋值为2
dfs(points,grid,m,n,i-1,j);
dfs(points,grid,m,n,i+1,j);
dfs(points,grid,m,n,i,j-1);
dfs(points,grid,m,n,i,j+1);
}
};