Question
Given an m x n matrix board containing 'X' and 'O', capture all regions that are 4-directionally surrounded by 'X'.
A region is captured by flipping all 'O's into 'X's in that surrounded region.
Solution
首先对所有在边缘上的“O”进行BFS或DFS搜索,将和边缘连续的“O”改为“#”或任意其他字符。
然后遍历整个board,如果是“O”则改为“X”,如果是“#”则恢复为“O”。
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| class Solution { public void solve(char[][] board) { for(int i = 0; i <board.length; i++){ for(int j = 0; j <board[0].length; j++){ boolean isEdge = (i == 0 || j == 0 || i == board.length-1 || j == board[0].length-1); if(isEdge && board[i][j] == 'O'){ bfs(board, i, j); } } } for(int i = 0; i < board.length; i++){ for(int j = 0; j < board[0].length; j++){ if(board[i][j] == '#') board[i][j] = 'O'; else if(board[i][j] == 'O') board[i][j] = 'X'; } } }
private void bfs(char[][] board, int x, int y){ int m = board.length; int n = board[0].length; Queue<int[]> q = new LinkedList<>(); q.add(new int[]{x, y}); int size = 1; while(!q.isEmpty()){ for(int k = 0; k < size; k++){ int[] curr = q.poll(); int i = curr[0], j = curr[1]; if( i<0 || j<0 || i>m-1 || j>n-1 || board[i][j] == 'X' || board[i][j] == '#' ) continue; board[i][j] = '#'; q.add(new int[]{i+1,j}); q.add(new int[]{i-1,j}); q.add(new int[]{i,j+1}); q.add(new int[]{i,j-1}); } size = q.size(); } } }
|