题目说只会有两个不相邻的岛,因此可以让其中一个岛扩大,每向外扩大一格,就检查是否与另外的岛相邻,如果相邻,则扩大的次数就是题目的答案
因此需要1.标记其中一个岛屿(使用DFS)2.将另外一个岛屿进行扩大(使用BFS)
class Solution {
public:
void dfs(vector<vector<int>>& grid, int x,int y)
{
if(x < 0 || x >= grid.size() || y < 0 || y >= grid.size() || grid[x][y] <= 0)
return;
grid[x][y] = -1;
dfs(grid, x, y + 1);
dfs(grid, x, y - 1);
dfs(grid, x + 1, y);
dfs(grid, x - 1, y);
}
int bfs(vector<vector<int>>& grid, int loop)
{
int n = grid.size();
vector<vector<int>> g = grid;
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
if(grid[i][j] != 1)
continue;
if(i - 1 >= 0)
{
if(grid[i - 1][j] == -1)
return loop;
g[i - 1][j] = 1;
}
if(i + 1 < n)
{
if(grid[i + 1][j] == -1)
return loop;
g[i + 1][j] = 1;
}
if(j - 1 >= 0)
{
if(grid[i][j - 1] == -1)
return loop;
g[i][j - 1] = 1;
}
if(j + 1 < n)
{
if(grid[i][j + 1] == -1)
return loop;
g[i][j + 1] = 1;
}
}
}
return bfs(g, loop + 1);
}
int shortestBridge(vector<vector<int>>& grid) {
int n = grid.size();
for(int i = 0; i < n; i++)
{
int flag = 0;
for(int j = 0; j < n; j++)
{
if(grid[i][j] == 1)
{
dfs(grid, i, j);
flag = 1;
break;
}
}
if(flag == 1)
break;
}
// for(int i = 0; i < n; i++)
// {
// for(int j = 0; j < n; j++)
// cout<<grid[i][j]<<" ";
// cout<<endl;
// }
return bfs(grid, 0);
}
};