https://leetcode.com/problems/surrounded-regions/
类似于围棋的算法,一个二维矩阵,由字母‘X’和字母'O'组成,当发现一个O被X包围的时候,把O都换成X,但是有例外,当O在矩阵的边缘的时候,不算被包围,且跟边缘相连通(水平或者垂直)的O也不算被包围
思路
先找出边缘不能变的O,那么其他的O就都是被包围的了,一定能变
如何找出边缘不能变的O?遍历矩阵的四周(第一行和最后一行,第一列和最后一列),只要发现边缘有O,然后利用BFS,找到他的临近的O,并统统都变成一个临时的字符,比如‘#’
边缘的O都找完后怎么办? 重新遍历矩阵里面的所有格子,如果发现O就变成X,如果发现#,就变成O
public void solve(char board[][]) {
if (board == null || board.length <= 1 || board[0].length <= 1) {
return;
}
//第一行和最后一行进行变化fill
for (int i = 0; i < board[0].length; i++) {
fill(board, 0, i);
fill(board, board.length - 1, i);
}
//第一列和最后一列变化fill
for (int i = 0; i < board.length; i++) {
fill(board, i, 0);
fill(board, i, board[0].length - 1);
}
//对于当前格子,所有的O变成X
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
if (board[i][j] == 'O') {
board[i][j] = 'X';
} else if (board[i][j] == '#') {
board[i][j] = 'O';
}
}
}
}
public void fill(char[][] board, int i, int j) {
if (board[i][j] != 'O') {
return;
}
board[i][j] = '#';
//查看i,j四周的坐标,如果存在'O',则一并变成'#'
if (i > 0 && board[i - 1][j] == 'O') {
fill(board, i - 1, j);
}
if (j < board[i].length - 1 && board[i][j + 1] == 'O') {
fill(board, i, j + 1);
}
if (i < board.length - 1 && board[i + 1][j] == 'O') {
fill(board, i + 1, j);
}
if (j > 0 && board[i][j - 1] == 'O') {
fill(board, i, j - 1);
}
}
网友评论