题目:
130. 被围绕的区域
题解:DFS + 沉岛思想
1. 解释一:
2. 解释二:
3. 解释三:
代码:DFS + 沉岛思想
public class code130 {
int m
= 0;
int n
= 0;
public void solve(char[][] board
) {
m
= board
.length
;
if(m
== 0)
{
return;
}
n
= board
[0].length
;
for(int i
= 0; i
< n
; i
++)
{
if(board
[0][i
] == 'O')
{
dfs(board
, 0 , i
);
}
if(board
[m
- 1][i
] == 'O')
{
dfs(board
, m
- 1, i
);
}
}
for(int i
= 1; i
< m
- 1; i
++)
{
if(board
[i
][0] == 'O')
{
dfs(board
, i
, 0);
}
if(board
[i
][n
- 1] == 'O')
{
dfs(board
, i
, n
- 1);
}
}
for(int i
= 0; i
< m
; i
++)
{
for(int j
= 0; j
< n
; j
++)
{
if(board
[i
][j
] == 'X')
{
continue;
}
else if(board
[i
][j
] == 'O')
{
board
[i
][j
] = 'X';
}
else if(board
[i
][j
] == 'M')
{
board
[i
][j
] = 'O';
}
}
}
}
public void dfs(char[][] board
, int x
, int y
)
{
if(x
< 0 || x
>= m
|| y
< 0 || y
>= n
|| board
[x
][y
] != 'O')
{
return;
}
board
[x
][y
] = 'M';
dfs(board
, x
- 1, y
);
dfs(board
, x
+ 1, y
);
dfs(board
, x
, y
- 1);
dfs(board
, x
, y
+ 1);
}
public static void main(String
[] args
) {
char board
[][] = {{'X', 'X', 'X', 'X'}, {'X', 'O', 'O', 'X'}, {'X', 'X', 'O', 'X'}, {'X', 'O', 'X', 'X'}};
for(int i
= 0; i
< board
.length
; i
++)
{
for(int j
= 0; j
< board
[0].length
; j
++)
{
System
.out
.print(board
[i
][j
] + " ");
}
System
.out
.println();
}
System
.out
.println("***************************************");
code130 test
= new code130();
test
.solve(board
);
for(int i
= 0; i
< board
.length
; i
++)
{
for(int j
= 0; j
< board
[0].length
; j
++)
{
System
.out
.print(board
[i
][j
] + " ");
}
System
.out
.println();
}
}
}
参考:
被围绕的区域,DFS+BFS,思路明确,注释详细被围绕的区域bfs+递归dfs+非递归dfs+并查集DFS + BFS + 并查集DFS、并查集(Java)c++,beats 94.65%,easy to understand