题解 | #牛群的活动区域#
牛群的活动区域
https://www.nowcoder.com/practice/eabeca0c6e944a618f8adfed128d847e
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param board char字符型二维数组
* @return char字符型二维数组
*/
public char[][] solve (char[][] board) {
int m = board.length, n = board[0].length;
int[][] dirs = new int[][] {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
boolean[][] flag = new boolean[m][n];
Queue<int[]> queue = new ArrayDeque<>();
for (int i = 0; i < m; i++) {
if (board[i][0] == 'B') {
queue.offer(new int[] {i, 0});
}
if (board[i][n - 1] == 'B') {
queue.offer(new int[] {i, n - 1});
}
}
for (int i = 0; i < n; i++) {
if (board[0][i] == 'B') {
queue.offer(new int[] {0, i});
}
if (board[m - 1][i] == 'B') {
queue.offer(new int[] {m - 1, i});
}
}
while (!queue.isEmpty()) {
int[] poll = queue.poll();
int x = poll[0], y = poll[1];
flag[x][y] = true;
for (int[] dir : dirs) {
int nx = x + dir[0], ny = y + dir[1];
if (nx >= 0 && nx < m && ny >= 0 && ny < n && !flag[nx][ny] &&
board[nx][ny] == 'B') {
queue.offer(new int[] {nx, ny});
}
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (!flag[i][j] && board[i][j] == 'B') {
board[i][j] = 'A';
}
}
}
return board;
}
}
知识点:
广度优先搜索
解题分析:
题目要求要将被包围的B转换为A,边界处不属于被包围的范围,故我们可以从边界出发,向内遍历所有的B并标记,表明被标记的B不会被转换成A。具体来说,将四个边界的B入队,然后依次出队,向四个方向进行广度优先搜索,将其依次标记并入队,直至队列中没有剩余元素,也就标记了所有的与边界相通的B。
编程语言:
java
查看10道真题和解析