Description:
Given a 2D board containing 'X'
and 'O'
(the letter O), capture all regions surrounded by 'X'
.
A region is captured by flipping all 'O'
s into 'X'
s in that surrounded region.
Note:
For example,
X X X X X O O X X X O X X O X X
After running your function, the board should be:
X X X X X X X X X X X X X O X X
Solution:
Analysis and Thinking:
题目意思为给定一个二维矩阵,里面包含O、X,要求把所有被X包围的O变为X,题目可以用很多解法比如DFS、BFS等,这里采用dfs的方式进行解决
Steps:
1.判断输入的board矩阵是否为空,若是则返回
2.获取矩阵的行列长度
3.按行元素进行深度优先遍历,判断输入矩阵的下标信息,当行列坐标都没越界,元素置为‘D’
4.按列元素进行深度优先遍历,判断输入矩阵的下标信息,当行列坐标都没越界,元素置为‘D’
5.深度优先的顺序为某一元素的四周,即其行列坐标加减1可得的四个位置的元素
6.最后循环遍历后的board,当其元素为‘O’,置换为‘X’,返回
Codes:
public class Solution {
int i,j;
char[][] board;
void dfs(int x, int y){
if(x<0 || x>=i || y<0 || y>=j || board[x][y]!='O') return;
board[x][y]='D';
dfs(x-1,y);
dfs(x+1,y);
dfs(x,y-1);
dfs(x,y+1);
}
public void methodMain(char[][] board){
if(board==null || board.length==0) return;
this.board=board;
i=board.length;
j=board[0].length;
for(int y=0;y<i;y++){
dfs(0,y);
dfs(y-1,j);
}
for(int x=1;x<j-1;x++){
dfs(x,0);
dfs(x,i-1);
}
for(int x=0;x<m;x++)
for(int y=0;y<n;y++){
if(board[x][y]=='O') board[x][y]='X';
else if(board[x][y]=='D') board[i][j]='O';
}
}
}
Results: