130. Surrounded Regions
该题是要将被X包围的O区域用X覆盖,处于边界的O区域不算是被X包围。
主要解决思路是遍历边框的的元素,如果是O,那么从该区域开始,进行深度遍历,将是O的区域改成Y,表示这个区域是没有被包围的。完成边框遍历后,剩下的O区域都是被X包围的了。对所有元素进行遍历,将O改成X, 将Y改回O即可。
代码如下:
1 class Solution {
2 public void solve(char[][] board) {
3 if( board.length == 0 || board == null ){
4 return;
5 }
6
7 int m = board.length, n = board[0].length;
8
9 for(int i = 0, j = 0 ; i < m; i++){
10 if(board[i][j] == 'O'){
11 occupy(board, i, j);
12 }
13 }
14
15 for(int i = 0, j = n - 1 ; i < m; i++){
16 if(board[i][j] == 'O'){
17 occupy(board, i, j);
18 }
19 }
20
21 for(int i = 0, j = 0; j < n ; j++){
22 if(board[i][j] == 'O'){
23 occupy(board, i, j);
24 }
25 }
26
27 for(int i = m - 1, j = 0 ; j < n; j++){
28 if(board[i][j] == 'O'){
29 occupy(board, i, j);
30 }
31 }
32
33 for(int i = 0 ; i < m ; i++){
34 for(int j = 0; j < n ; j++){
35 if(board[i][j] == 'O'){
36 board[i][j] = 'X';
37 }
38
39 if(board[i][j] == 'Y'){
40 board[i][j] = 'O';
41 }
42 }
43 }
44
45 }
46
47 private void occupy(char[][] board, int i, int j){
48 board[i][j] = 'Y';
49
50 int m = board.length, n = board[0].length;
51 if( i + 1 < m && board[i+1][j] == 'O'){
52 occupy(board, i + 1, j);
53 }
54
55 if( i - 1 >= 0 && board[i-1][j] == 'O' ){
56 occupy(board, i - 1, j);
57 }
58
59 if( j + 1 < n && board[i][j+1] == 'O'){
60 occupy(board, i , j + 1);
61 }
62
63 if( j - 1 >= 0 && board[i][j-1] == 'O'){
64 occupy(board, i, j - 1);
65 }
66 }
67 }
END