题目链接
思路:
题目要求将被 x 包围住的 o 改为 x,且被填充的 o 不能位于边界处。若有o不在边界,但却与内部的 o 相连,则不能被填充
那么,在填充之前,需要将边界上的o与其相连的o进行标记,以免被误填充
标记时,需要对区域的四条边界都进行深度优先搜先,找到与边界的o相连的o进行标记
这里,可以使用除了o和x之外的任何字符来对o进行标记
除了标记的o之外,剩余未被标记的o即为需要被填充的o
再次遍历,将未标记的o用x填充,将标记号用o填充
public void solve(char[][] board) {
if (board == null || board.length == 0 || board[0].length <= 2) {
return ;
}
int row = board.length;
int col = board[0].length;
for (int i = 0; i < row; i++) {
// 对第1列中的 O 进行dfs标记
dfs(board, i, 0);
// 对最后1列中的 O 进行dfs标记
dfs(board, i, col - 1);
}
for (int j = 0; j < col; j++) {
// 对第1行中的 O 进行dfs标记
dfs(board, 0, j);
// 对最后1行中的 O 进行dfs标记
dfs(board, row - 1, j);
}
// 遍历每一个元素,替换标记,进行填充
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
// 若为O,则说明未与边界O相连,用X填充
if (board[i][j] == 'O') {
board[i][j] = 'X';
} else if (board[i][j] == '*') { // 若为标记符,则说明与边界O相连,用O填充
board[i][j] = 'O';
}
}
}
}
private void dfs(char[][] board, int i, int j) {
// 边界条件,i,j必须在区域内部,且此位置处必须为O
if (i < 0 || i >= board.length
|| j < 0 || j >= board[0].length
|| board[i][j] != 'O') {
return ;
}
// 将当前位置用标记符进行填充
board[i][j] = '*';
// 分为四个方向进行搜索
// 上一行中同列元素搜索
dfs(board, i - 1, j);
// 下一行中同列元素搜索
dfs(board, i + 1, j);
// 同一行中左侧元素搜索
dfs(board, i, j - 1);
// 同一行中右侧元素搜索
dfs(board, i, j + 1);
return ;
}
代码参考自:https://leetcode-cn.com/problems/surrounded-regions/comments/8717