思路:先利用dfs或者bfs找到其中一个连通分量,并将这个连通分量里的格子设置为2,然后再利用bfs从这个连通分量中的结点开始扩展(将0的格子扩展为2),直到扩展到为1的格子结束,此时的路径最短。
代码:
class Solution {
public:
struct p{
int x,y,s;
p(int xx,int yy,int ss){
x=xx;
y=yy;
s=ss;
}
};
vector<pair<int,int> >st;
int r,c;
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
queue<p>q;
bool check(int x,int y){
if(x>=0&&x<r&&y>=0&&y<c)
return true;
return false;
}
void dfs(int r,int c,vector<vector<int>>& A){
if(!check(r,c))
return;
if(A[r][c]!=1) //只搜索1
return;
A[r][c]=2; //搜索出来的一个连通分量用2表示
st.push_back(make_pair(r,c));
for(int i=0;i<4;i++){
int x=r+dir[i][0];
int y=c+dir[i][1];
dfs(x,y,A);
}
}
int bfs(vector<vector<int>>& A){
for(auto it:st){
q.push(p(it.first,it.second,0));
}
while(!q.empty()){
p f=q.front();
q.pop();
for(int i=0;i<4;i++){
int xx=f.x+dir[i][0];
int yy=f.y+dir[i][1];
if(!check(xx,yy))
continue;
if(A[xx][yy]==1){ //搜索到1结束,返回最短路径长度
return f.s;
}
if(A[xx][yy]==0){ //将0扩展为2
A[xx][yy]=2;
q.push(p(xx,yy,f.s+1));
}
}
}
return 0;
}
int shortestBridge(vector<vector<int>>& A) {
r=A.size();
c=A[0].size();
for(int i=0;i<r*c;i++){
if(A[i/c][i%c]){
dfs(i/c,i%c,A);
break;
}
}
return bfs(A);
}
};