130. 被围绕的区域
问题描述
给定一个二维的矩阵,包含 ‘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遍历四周的O,把所有与四周O相连的O都改为Y,然后遍历grid数组,把剩下的与四周不连通的O改为X,把Y改为O
代码
package com.lry.basic.algorithm.floodfill;
//leetcode 130
public class NumOfEnclaves2 {
public void solve(char[][] grid) {
if(null==grid||grid.length==0) return;
//第一行和最后一行
for(int i=0;i<grid[0].length;i++){
dfs(grid,0,i);
dfs(grid,grid.length-1,i);
}
//第一列和最后一列
for(int i=0;i<grid.length;i++){
dfs(grid,i,0);
dfs(grid,i,grid[0].length-1);
}
for(int i=0;i<grid.length;i++){
for(int j=0;j<grid[0].length;j++){
if(grid[i][j]=='O'){
grid[i][j] = 'X';
}
if(grid[i][j]=='Y'){
grid[i][j] = 'O';
}
}
}
}
private void dfs(char[][] grid,int i,int j){
if(i<0||i>grid.length-1||j<0||j>grid[0].length-1||grid[i][j]!='O'){
return ;
}
grid[i][j] = 'Y';
dfs(grid,i+1,j);
dfs(grid,i-1,j);
dfs(grid,i,j+1);
dfs(grid,i,j-1);
}
public static void main(String[] args) {
char[][]c = new char[][]{{'X','X','X','X'}, {'X','O','O','X'}, {'X','X','O','X'}, {'X','O','O','X'}};
new NumOfEnclaves2().solve(c);
for(int i=0;i<c.length;i++){
for(int j=0;j<c[0].length;j++){
System.out.print(c[i][j]+" ");
}
System.out.println();
}
}
}