leetcode: Surrounded Regions

 1 class Solution {
 2 public:
 3     void solve(vector<vector<char>>& board) {
 4         if (board.empty()) return;
 5         int n = board.size();
 6         int m = board[0].size();
 7         // Top-most line
 8         for (int j = 0; j < m; ++j)
 9             if (board[0][j] == 'O')
10                 DFS(board, 0, j);
11         // Right-most column
12         for (int i = 1; i < n; ++i)
13             if (board[i][m-1] == 'O')
14                 DFS(board, i, m - 1);
15         // Bottom-most line
16         for (int j = 0; j < m - 1; ++j)
17             if (board[n-1][j] == 'O')
18                 DFS(board, n - 1, j);
19         // Left-most column
20         for (int i = 1; i < n - 1; ++i)
21             if (board[i][0] == 'O')
22                 DFS(board, i, 0);
23         // Change interior 'O's to 'X's meanwhile restoring '#'s to 'O's
24         for (auto& vec: board)
25             for (char& c : vec)
26                 if (c == 'O')
27                     c = 'X';
28                 else if (c == '#')
29                     c = 'O';
30     }
31 
32     void DFS(vector<vector<char>>& board, int i, int j) {
33         board[i][j] = '#';
34         if (i - 1 >= 0 && board[i-1][j] == 'O')
35             DFS(board, i - 1, j);
36         if (j + 1 < board[0].size() && board[i][j+1] == 'O')
37             DFS(board, i, j + 1);
38         if (i + 1 < board.size() && board[i+1][j] == 'O')
39             DFS(board, i + 1, j);
40         if (j - 1 >= 0 && board[i][j-1] == 'O')
41             DFS(board, i, j - 1);
42     }
43 
44     void BFS(vector<vector<char>>& board, int row, int col) {
45         board[row][col] = '#';
46         queue<pair<int, int>> Q;
47         Q.push(make_pair(row, col));
48         while (!Q.empty()) {
49             int i = Q.front().first;
50             int j = Q.front().second;
51             Q.pop();
52             if (i - 1 >= 0 && board[i-1][j] == 'O') {
53                 board[i-1][j] = '#';
54                 Q.push(make_pair(i - 1, j));
55             }
56             if (j + 1 < board[0].size() && board[i][j+1] == 'O') {
57                 board[i][j+1] = '#';
58                 Q.push(make_pair(i, j + 1));
59             }
60             if (i + 1 < board.size() && board[i+1][j] == 'O') {
61                 board[i+1][j] = '#';
62                 Q.push(make_pair(i + 1, j));
63             }
64             if (j - 1 >= 0 && board[i][j-1] == 'O') {
65                 board[i][j-1] = '#';
66                 Q.push(make_pair(i, j - 1));
67             }
68         }
69     }
70 };

 

 

posted @ 2013-04-28 13:18  caijinlong  阅读(123)  评论(0编辑  收藏  举报