C代码:BFS
void dfs(int x, int y, int** grid, int n, int *queue, int *tail) {
if (x < 0 || y < 0 || x >= n || y >= n || grid[x][y] != 1) {
return;
}
queue[(*tail)++] = x * n + y;
grid[x][y] = -1;
dfs(x - 1, y, grid, n, queue, tail);
dfs(x + 1, y, grid, n, queue, tail);
dfs(x, y - 1, grid, n, queue, tail);
dfs(x, y + 1, grid, n, queue, tail);
}
int shortestBridge(int** grid, int gridSize, int* gridColSize) {
int n = gridSize;
int dirs[4][2] = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == 1) {
int *queue = (int *)malloc(sizeof(int) * n * n);
int head = 0, tail = 0;
dfs(i, j, grid, n, queue, &tail); // 把所有连续1的坐标放入数组中(只有两个岛)
int step = 0;
while (head < tail) {
int len = tail - head;
while (len--) { // 分层
int x = queue[head] / n;
int y = queue[head++] % n; // 取出每层的坐标,然后遍历四周一层的空白区域,每层遍历直到抵达另一个岛
for (int k = 0; k < 4; k++) {
int dx = x + dirs[k][0];
int dy = y + dirs[k][1];
if (dx >= 0 && dy >= 0 && dx < n && dy < n) {
if (grid[dx][dy] == 0) {
queue[tail++] = dx * n + dy;
grid[dx][dy] = -1;
} else if (grid[dx][dy] == 1) {
return step;
}
}
}
}
step++;
}
}
}
}
return 0;
}