题目
链接:https://leetcode-cn.com/problems/surrounded-regions
给定一个二维的矩阵,包含 ‘X’ 和 ‘O’(字母 O)。
找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。
示例:
X X X X
X O O X
X X O X
X O X X
运行你的函数后,矩阵变为:
X X X X
X X X X
X X X X
X O X X
解释:
被围绕的区间不会存在于边界上,换句话说,任何边界上的 ‘O’ 都不会被填充为 ‘X’。 任何不在边界上,或不与边界上的 ‘O’ 相连的 ‘O’ 最终都会被填充为 ‘X’。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。
dfs
思路:
由题可知没有被字母X包围的字母O一定与边界的O相连,因此可以遍历边界如果遇到字符O则进行深度优先搜索,将与其相连的字符O标记为字母T,上下左右四个边界遍历完成后,遍历整个矩阵,此时矩阵中未被标记的字符O就是被X包围的因此将其填充为X,再将矩阵中被标记为T的字符变回O,这样就完成了区域填充。
class Solution {
int[][] dirs = new int[][]{{0,1}, {1, 0}, {-1, 0}, {0,-1}};
int rows;
int cols;
public void solve(char[][] board) {
if (board.length == 0) return;
rows = board.length;
cols = board[0].length;
for (int i = 0; i < rows; i++) {
dfs(board, i, 0);// 左边界
dfs(board, i, cols-1);// 右边界
}
for (int i = 0; i < cols; i++) {
dfs(board, 0, i);
dfs(board, rows - 1, i);
}
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (board[i][j] == 'T') {
board[i][j] = 'O';
} else if ( board[i][j] == 'O') {
board[i][j] = 'X';
}
}
}
}
private void dfs (char[][] board, int x, int y) {
if (x < 0 || x >= rows || y < 0 || y >= cols || board[x][y] != 'O')
return;
board[x][y] = 'T';
for (int[] dir : dirs) {
dfs(board, x + dir[0], y + dir[1]);
}
}
}