classSolution{public:intshortestBridge(vector<vector<int>>&grid){markGridTwo(grid);for(intcolor=2;;++color)for(inti=0;i<grid.size();++i)for(intj=0;j<grid[0].size();++j)if(grid[i][j]==color)if(expand(grid,i+1,j,color)||expand(grid,i-1,j,color)||expand(grid,i,j+1,color)||expand(grid,i,j-1,color))returncolor-2;}private:// Mark one group to 2s by DFSvoidmarkGridTwo(vector<vector<int>>&grid){for(inti=0;i<grid.size();++i)for(intj=0;j<grid[0].size();++j)if(grid[i][j]==1){markGridTwo(grid,i,j);return;}}voidmarkGridTwo(vector<vector<int>>&grid,inti,intj){if(i<0||i==grid.size()||j<0||j==grid[0].size())return;if(grid[i][j]!=1)return;grid[i][j]=2;markGridTwo(grid,i+1,j);markGridTwo(grid,i-1,j);markGridTwo(grid,i,j+1);markGridTwo(grid,i,j-1);}// Expand from colors' group to 1s' groupboolexpand(vector<vector<int>>&grid,inti,intj,intcolor){if(i<0||i==grid.size()||j<0||j==grid[0].size())returnfalse;if(grid[i][j]==0)grid[i][j]=color+1;returngrid[i][j]==1;// We touch the 1s' group!}};
classSolution{publicintshortestBridge(int[][]grid){markGridTwo(grid);for(intcolor=2;;++color)for(inti=0;i<grid.length;++i)for(intj=0;j<grid[0].length;++j)if(grid[i][j]==color)if(expand(grid,i+1,j,color)||expand(grid,i-1,j,color)||expand(grid,i,j+1,color)||expand(grid,i,j-1,color))returncolor-2;}// Mark one group to 2s by DFSprivatevoidmarkGridTwo(int[][]grid){for(inti=0;i<grid.length;++i)for(intj=0;j<grid[0].length;++j)if(grid[i][j]==1){markGridTwo(grid,i,j);return;}}privatevoidmarkGridTwo(int[][]grid,inti,intj){if(i<0||i==grid.length||j<0||j==grid[0].length)return;if(grid[i][j]!=1)return;grid[i][j]=2;markGridTwo(grid,i+1,j);markGridTwo(grid,i-1,j);markGridTwo(grid,i,j+1);markGridTwo(grid,i,j-1);}// Expand from colors' group to 1s' groupprivatebooleanexpand(int[][]grid,inti,intj,intcolor){if(i<0||i==grid.length||j<0||j==grid[0].length)returnfalse;if(grid[i][j]==0)grid[i][j]=color+1;returngrid[i][j]==1;// We touch the 1s' group!}}
classSolution{public:intshortestBridge(vector<vector<int>>&grid){constintn=grid.size();constvector<int>dirs{0,1,0,-1,0};intans=0;queue<pair<int,int>>q;markGridTwo(grid,q);// Expand by BFSwhile(!q.empty()){for(intsz=q.size();sz>0;--sz){constauto[i,j]=q.front();q.pop();for(intk=0;k<4;++k){constintx=i+dirs[k];constinty=j+dirs[k+1];if(x<0||x==n||y<0||y==n)continue;if(grid[x][y]==2)continue;if(grid[x][y]==1)returnans;grid[x][y]=2;q.emplace(x,y);}}++ans;}throw;}private:// Mark one group to 2s by DFSvoidmarkGridTwo(vector<vector<int>>&grid,queue<pair<int,int>>&q){for(inti=0;i<grid.size();++i)for(intj=0;j<grid[0].size();++j)if(grid[i][j]==1){markGridTwo(grid,i,j,q);return;}}// Mark one group to 2s by DFS and push them to the qvoidmarkGridTwo(vector<vector<int>>&grid,inti,intj,queue<pair<int,int>>&q){if(i<0||i==grid.size()||j<0||j==grid[0].size())return;if(grid[i][j]!=1)return;grid[i][j]=2;q.emplace(i,j);markGridTwo(grid,i+1,j,q);markGridTwo(grid,i-1,j,q);markGridTwo(grid,i,j+1,q);markGridTwo(grid,i,j-1,q);}};