题目:934. 最短的桥
思路:广度优先搜索
class Solution {
public:
int shortestBridge(vector<vector<int>>& grid) {
vector<int> direction{-1,0,1,0,-1};
int n = grid.size();
int x1=-1,y1=-1;
for(int i=0;i<n;++i){
for(int j=0;j<n;++j){
if(grid[i][j]==1){
x1=i;
y1=j;
goto ga;
}
}
}
ga:
queue<pair<int,int>> que;
set<pair<int,int>> st;
if(x1!=-1 && y1!=-1){
que.push(make_pair(x1,y1));
st.insert(make_pair(x1,y1));
}
while(!que.empty()){
int temp_x = que.front().first;
int temp_y = que.front().second;
grid[temp_x][temp_y]=2;
for(int i=0;i<4;++i){
if(temp_x+direction[i]<n && temp_x+direction[i]>=0
&& temp_y+direction[i+1]<n && temp_y+direction[i+1]>=0
&& grid[temp_x+direction[i]][temp_y+direction[i+1]]==1){
que.push(make_pair(temp_x+direction[i],temp_y+direction[i+1]));
st.insert(make_pair(temp_x+direction[i],temp_y+direction[i+1]));
grid[temp_x+direction[i]][temp_y+direction[i+1]]=2;
}
}
que.pop();
}
queue<pair<int,int>> ques;
for(auto i=st.begin();i!=st.end();++i){
ques.push(make_pair((*i).first,(*i).second));
}
cout<<" sss";
int ans = 0;
while(!ques.empty()){
int size=ques.size();
for(int j=0;j<size;j++){
int temp_x = ques.front().first;
int temp_y = ques.front().second;
ques.pop();
for(int i=0;i<4;++i){
if(temp_x+direction[i]<n && temp_x+direction[i]>=0
&& temp_y+direction[i+1]<n && temp_y+direction[i+1]>=0
){
if(grid[temp_x+direction[i]][temp_y+direction[i+1]]==1){
return ans;
}
if(grid[temp_x+direction[i]][temp_y+direction[i+1]]==2){
continue;
}
if(grid[temp_x+direction[i]][temp_y+direction[i+1]]==0){
grid[temp_x+direction[i]][temp_y+direction[i+1]]=2;
ques.push(make_pair(temp_x+direction[i],temp_y+direction[i+1]));
}
}
}
}
ans++;
}
return ans;
}
};