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这道题的题意是把那些四周被'X'包围的'O'都变成'X'
那么可以发现最外面的四周如果有O, 那么与之相连的O才能不被包围
所以就对最外层的'O'进行特殊处理, 对外层的'O'进行BFS, 把与之相连的O和它本身都变成'#'
这样一来对于整个矩阵 如果还是'O'的说明他被X包围, 应该变成X, 把所有的# 再变成O
//bfs public class Solution { public void solve(char[][] board) { if (board == null || board.length <= 1 || board[0].length <= 1) { return; } for (int i = 0; i <board[0].length; i++) {//fill第一行和最后一行 fill(board, 0, i); fill(board, board.length - 1, i); } for (int i = 0; i < board.length; i++) {//对第一列和最后一列fill fill(board, i, 0); fill(board, i, board[0].length - 1); } for (int i = 0; i< board.length; i++) { //最后一次遍历, 把内部的'O'变成'X', '#'变成'O' 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] = '#'; Queue<Integer> queue = new LinkedList<Integer>(); queue.offer(i * board[0].length + j);//把矩阵的横纵坐标编码存储 while (!queue.isEmpty()) { int cur = queue.poll(); //解码 int row = cur / board[0].length; int column = cur % board[0].length; if (row > 0 && board[row - 1][column] == 'O') {//向上找 queue.offer((row - 1) * board[0].length + column); board[row - 1][column] = '#'; } if (row < board.length - 1 && board[row + 1][column] == 'O') {//向下找 queue.offer((row + 1) * board[0].length + column); board[row + 1][column] = '#'; } if (column > 0 && board[row][column - 1] == 'O') {//向左找 queue.offer(row * board[0].length + column - 1); board[row][column - 1] = '#'; } if (column < board[0].length - 1 && board[row][column + 1] == 'O') {//向右找 queue.offer(row * board[0].length + column + 1); board[row][column + 1] = '#'; } } } } //dfs cause stack over flow public class Solution { public void solve(char[][] board) { if (board == null || board.length <= 1 || board[0].length <= 1) { return; } int m = board.length; int n = board[0].length; for (int i = 0; i < m; i++) { if (board[i][0] == 'O') { bfs(board, i, 0); } if (board[i][n - 1] == 'O') { bfs(board, i, n - 1); } } for (int i = 1; i <= n - 2; i++) { if (board[0][i] == 'O') { bfs(board, 0, i); } if (board[m-1][0] == 'O') { bfs(board, m - 1, i); } } for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (board[i][j] == 'O') { board[i][j] = 'X'; } } } for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (board[i][j] == '#') { board[i][j] = 'O'; } } } } public void bfs(char[][] board, int column, int row) { if (column < 0 || column >= board.length || row < 0 || row >= board[0].length || board[column][row] != 'O') { return; } board[column][row] = '#'; bfs(board, column - 1, row); bfs(board, column + 1, row); bfs(board, column, row - 1); bfs(board, column, row + 1); } }
没有评论:
发表评论