题目描述:

Given a 2D board containing 'X' and 'O' (the letter 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'全部用'W'替换,然后把二维数组中的'O'全部变为'X',最后再把换'W'换回来。

代码:

 1 class Solution {
 2 public:
 3     void search(vector<vector<char>>& board, int row, int col, char c1, char c2)
 4     //寻找延伸出的'O'或是'W',并替换
 5 {
 6         if(row < 0 || row >= board.size() || col < 0 || col >= board[0].size())
 7             return;
 8         if(board[row][col] == c1)
 9             board[row][col] = c2;
10         else
11             return;
12         search(board, row+1, col, c1, c2);
13         search(board, row-1, col, c1, c2);
14         search(board, row, col+1, c1, c2);
15         search(board, row, col-1, c1, c2);
16     }
17     void solve(vector<vector<char>>& board) {
18         int nRow = board.size();
19         if(nRow < 1)
20             return;
21         int nCol = board[0].size();
22         for(int i = 0; i < nRow; i++){
23         //寻找第一行和最后一行
24             if(board[i][0] == 'O')
25                 search(board, i, 0, 'O', 'W');
26             if(board[i][nCol-1] == 'O')
27                 search(board, i, nCol-1, 'O', 'W');
28         }
29         for(int i = 1; i < nCol-1; i++){
30         //第一列和最后一列
31             if(board[0][i] == 'O')
32                 search(board, 0, i, 'O', 'W');
33             if(board[nRow-1][i] == 'O')
34                 search(board, nRow-1, i, 'O', 'W');
35         }
36         for(int i = 1; i < nRow-1; i++){
37         //把二维数组中的'O'全部替换
38             for(int j = 1; j < nCol-1; j++){
39                 if(board[i][j] == 'O')
40                     board[i][j] = 'X';
41             }
42         }
43         for(int i = 0; i < nRow; i++){
44         //第一行和最后一行重新替换
45             if(board[i][0] == 'W')
46                 search(board, i, 0, 'W', 'O');
47             if(board[i][nCol-1] == 'W')
48                 search(board, i, nCol-1, 'W', 'O');
49         }
50         for(int i = 1; i < nCol-1; i++){
51         //第一列和最后一列
52             if(board[0][i] == 'W')
53                 search(board, 0, i, 'W', 'O');
54             if(board[nRow-1][i] == 'W')
55                 search(board, nRow-1, i, 'W', 'O');
56         }
57     }
58 };

 

 

 

posted on 2018-03-29 11:13  宵夜在哪  阅读(103)  评论(0编辑  收藏  举报