Careercup - Google面试题 - 5727310284062720

2014-05-06 14:04

题目链接

原题:

given an 2D matrix M, is filled either using X or O, you need to find the region which is filled by O and surrounded by X 

and fill it with X. 



example 1: 



X X X X X 

X X O O X 

X X O O X 

O X X X X 



Answer : 



X X X X X 

X X X X X 

X X X X X 

O X X X X 



example 2: 



X X X X X 

X X O O X 

X X O O O 

O X X X X 



answer 2: 

X X X X X 

X X O O X 

X X O O O 

O X X X X

题目:参见Leetcode题目Surrounded Regions

解法:题解位于LeetCode - Surrounded Regions

代码:

  1 // http://www.careercup.com/question?id=5727310284062720

  2 #include <iostream>

  3 #include <queue>

  4 #include <string>

  5 #include <vector>

  6 using namespace std;

  7 

  8 class Solution {

  9 public:

 10     void solve(vector<vector<char> > &board) {

 11         // Should n or m be smaller than 3, there'll be no captured region.

 12         n = (int)board.size();

 13         if (n < 3) {

 14             return;

 15         }

 16         

 17         m = (int)board[0].size();

 18         if (m < 3) {

 19             return;

 20         }

 21         

 22         int i, j;

 23         

 24         // if an 'O' is on the border, all of its connected 'O's are not captured.

 25         // so we scan the border and mark those 'O's as free.

 26         

 27         // the top row

 28         for (j = 0; j < m; ++j) {

 29             if (board[0][j] == 'O') {

 30                 check_region(board, 0, j);

 31             }

 32         }

 33         

 34         // the bottom row

 35         for (j = 0; j < m; ++j) {

 36             if (board[n - 1][j] == 'O') {

 37                 check_region(board, n - 1, j);

 38             }

 39         }

 40         

 41         // the left column

 42         for (i = 1; i < n - 1; ++i) {

 43             if (board[i][0] == 'O') {

 44                 check_region(board, i, 0);

 45             }

 46         }

 47         

 48         // the right column

 49         for (i = 1; i < n - 1; ++i) {

 50             if (board[i][m - 1] == 'O') {

 51                 check_region(board, i, m - 1);

 52             }

 53         }

 54         

 55         // other unchecked 'O's are all captured

 56         for (i = 0; i < n; ++i) {

 57             for (j = 0; j < m; ++j) {

 58                 if (board[i][j] == '#') {

 59                     // free 'O's

 60                     board[i][j] = 'O';

 61                 } else if (board[i][j] == 'O') {

 62                     // captured 'O's

 63                     board[i][j] = 'X';

 64                 }

 65             }

 66         }

 67     }

 68 private:

 69     int n, m;

 70     

 71     void check_region(vector<vector<char> > &board, int startx, int starty) {

 72         if (startx < 0 || startx > n - 1 || starty < 0 || starty > m - 1) {

 73             return;

 74         }

 75         if (board[startx][starty] == 'O') {

 76             board[startx][starty] = '#';

 77             check_region(board, startx - 1, starty);

 78             check_region(board, startx + 1, starty);

 79             check_region(board, startx, starty - 1);

 80             check_region(board, startx, starty + 1);

 81         }

 82     }

 83 };

 84 

 85 int main()

 86 {

 87     int n, m;

 88     int i, j;

 89     string str;

 90     vector<vector<char> > board;

 91     Solution sol;

 92     

 93     while (cin >> n >> m && (n > 0 && m > 0)) {

 94         board.resize(n);

 95         for (i = 0; i < n; ++i) {

 96             cin >> str;

 97             board[i].resize(m);

 98             for (j = 0; j < m; ++j) {

 99                 board[i][j] = str[j];

100             }

101         }

102         sol.solve(board);

103         for (i = 0; i < n; ++i) {

104             for (j = 0; j < m; ++j) {

105                 cout << board[i][j];

106             }

107             cout << endl;

108         }

109         

110         for (i = 0; i < n; ++i) {

111             board[i].clear();

112         }

113         board.clear();

114     }

115     

116     return 0;

117 }

 

你可能感兴趣的:(Google)