Leetcode130. 被围绕的区域(深搜)
问题描述
给定一个二维的矩阵,包含 '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'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。
代码
class Solution {
void def(int i,int j,int[][]res1,char[][]board) {
if(i-1>0&&board[i-1][j]=='O'&&res1[i-1][j]==0)
{
res1[i-1][j]=1;
def(i-1,j,res1,board);
}
if(i+1<board.length&&board[i+1][j]=='O'&&res1[i+1][j]==0)
{
res1[i+1][j]=1;
def(i+1,j,res1,board);
}
if(j-1>0&&board[i][j-1]=='O'&&res1[i][j-1]==0)
{
res1[i][j-1]=1;
def(i,j-1,res1,board);
}
if(j+1<board[0].length&&board[i][j+1]=='O'&&res1[i][j+1]==0)
{
res1[i][j+1]=1;
def(i,j+1,res1,board);
}
}
public void solve(char[][] board) {
if(board==null||board.length==0||board[0].length==0)
return;
int[][] res1=new int[board.length][board[0].length];
int[][] res2=new int[board.length][board[0].length];
for(int i=0;i<board.length;i++) {
int j=0;
if(board[i][j]=='O') {
res1[i][j]=1;
def(i,j,res1,board);
}
j=board[0].length-1;
if(board[i][j]=='O') {
res1[i][j]=1;
def(i,j,res1,board);
}
}
for(int j=0;j<board[0].length;j++) {
int i=0;
if(board[i][j]=='O') {
res1[i][j]=1;
def(i,j,res1,board);
}
i=board.length-1;
if(board[i][j]=='O') {
res1[i][j]=1;
def(i,j,res1,board);
}
}
for(int i=0;i<board.length;i++) {
for(int j=0;j<board[0].length;j++) {
if(board[i][j]=='O'&&res1[i][j]==0) {
board[i][j]='X';
}
}
}
}
}