最短的桥
在给定的二维二进制数组 A 中,存在两座岛。(岛是由四面相连的 1 形成的一个最大组。)
现在,我们可以将 0 变为 1,以使两座岛连接起来,变成一座岛。
返回必须翻转的 0 的最小数目。(可以保证答案至少是 1。)
输入:[[0,1],[1,0]]
输出:1
输入:[[0,1,0],[0,0,0],[0,0,1]]
输出:2
这题的思路是什么呢?
给你两座岛,那么你最应该先区别开两座岛,这里岛都是用1来表示,那我我其中一座岛一定得跟另一座岛区分开来,这样对后面无论怎样都有好处,用深搜找出第一座岛,把它标为2,接下来求最短路径那么就用BFS,从第二座岛出发,一层一层的查找,当最先到达第一座岛时,就是最短路径。
class Solution{
public:
int x[4]={-1,1,0,0};
int y[4]={0,0,1,-1};
int shortestBridge(vector<vector<int>>& A){
queue<pair<int,int>> q;
bool is_print = false;//标识条件,只找一次,找第一座岛
int row = A.size();
int column = A[0].size();
for(int i = 0; i < row; i++){
for (int j = 0; j < column; j++){
if (A[i][j] == 1 && !is_print){
dfs(A,i,j);
is_print = true;
}
if(A[i][j] == 1){
q.push({i,j});
A[i][j] = -1;//如果可以的话找过之后值都给它修改一下,标识已经走过,防止陷入死循环;
}
}
}
int minpath = 0;
while(!q.empty()){//广搜模板
int size = q.size();
for (int i = 0; i < size; i++){
auto p = q.front();
q.pop();
int r = p.first;
int c = p.second;
for (int j = 0; j < 4; j++){
int dx = r + x[j];
int dy = c + y[j];
if (dx >= 0 && dy >= 0 && dx < row && dy < column){
if (A[dx][dy] == 2){
return minpath;
}
else if (A[dx][dy] == 0){
q.push({dx,dy});
A[dx][dy] = -1;
}
}
}
}
++minpath;
}
return minpath;
}
void dfs(vector<vector<int>>& A, int r, int c){
A[r][c] = 2;
int row = A.size();
int column = A[0].size();
for (int i = 0; i < 4; i++){
int dx = r + x[i];
int dy = c + y[i];
if (dx >= 0 && dy >= 0 && dx < row && dy < column && A[dx][dy] == 1)
dfs (A,dx,dy);
}//深搜模板
}
};
之前答案一直出错,找了半天也没发现哪有问题,后面才知道原来是dx>=0,这些没有考虑等于0的情况。注意边界,注意边界,注意边界。