版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ccnuacmhdu/article/details/85923160
时间限制:1秒 空间限制:32768K 热度指数:17818
本题知识点: 数组 leetcode
算法知识视频讲解
题目描述
Given a 2D board containing’X’and’O’, capture all regions surrounded by’X’.
A region is captured by flipping all’O’s into’X’s in that surrounded region .
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
/*
其实就是简单的dfs,关键还是思路:https://www.nowcoder.com/questionTerminal/c159db5028034aa595043a1a220a62dd
四个边上的O,及与之相连的O都不能变(可以暂时变成#,和其他O区分,最后变回来即可),其他的O肯定是被包围的,变为X
*/
public class Solution {
public void solve(char[][] board) {
if(board == null || board.length == 0 || board[0].length == 0){
return;
}
//对四条边上的O进行dfs
int row = board.length;
int col = board[0].length;
for(int i = 0; i < row; i++){
dfs(board, i, 0);//第0列
dfs(board, i, col-1);//第col-1列
}
for(int i = 0; i < col; i++){
dfs(board, 0, i);//第0行
dfs(board, row-1, i);//第row-1行
}
//把所有O变为X
for(int i = 0; i < row; i++){
for(int j = 0; j < col; j++){
if(board[i][j] == 'O'){
board[i][j] = 'X';
}
}
}
//把所有#变回O
for(int i = 0; i < row; i++){
for(int j = 0; j < col; j++){
if(board[i][j] == '#'){
board[i][j] = 'O';
}
}
}
}
private void dfs(char[][] board, int row, int col){
if(board[row][col] == 'O'){
board[row][col] = '#';
if(col > 0){
dfs(board, row, col-1);
}
if(col < board[0].length-1){
dfs(board, row, col+1);
}
if(row > 0){
dfs(board, row-1, col);
}
if(row < board.length-1){
dfs(board, row+1, col);
}
}
}
}