1 class Solution {
2 public:
3 struct point{
4 int x;
5 int y;
6 point(int _x, int _y):x(_x),y(_y){}
7 };
8 void solve(vector<vector<char> > &board){
9 if (board.size()<=1 || board[0].size()<=1)
10 return;
11 int m=board.size();
12 int n=board[0].size();
13 vector<bool> flag(n, false);
14 vector<vector<bool> >visitFlag(m, flag);
15 vector<vector<bool> >checkFlag(m, flag);
16 for (int i=0; i<m; i++)
17 for (int j=0; j<n; j++){
18 if (visitFlag[i][j])
19 continue;
20 if (board[i][j] == 'X'){
21 visitFlag[i][j] = true;
22 continue;
23 }
24 stack<point> sp;
25 vector<point> vp;
26 visitFlag[i][j] = true;
27 sp.push(point(i,j));
28 bool tF = false;
29 while (!sp.empty()){
30 point p = sp.top();
31 sp.pop();
32 vp.push_back(p);
33 if (p.x==0 || p.x==m-1 || p.y==0 || p.y==n-1)
34 tF = true;
35 if (p.x<m-1 && checkFlag[p.x+1][p.y])
36 tF = true;
37 if (p.y<n-1 && checkFlag[p.x][p.y+1])
38 tF = true;
39 if (p.x>0 && checkFlag[p.x-1][p.y])
40 tF = true;
41 if (p.y>0 && checkFlag[p.x][p.y-1])
42 tF = true;
43 if (p.x<m-1 && visitFlag[p.x+1][p.y]==false && board[p.x+1][p.y]=='O'){
44 visitFlag[p.x+1][p.y] = true;
45 sp.push(point(p.x+1,p.y));
46 }
47 if (p.y<n-1 && visitFlag[p.x][p.y+1]==false && board[p.x][p.y+1]=='O'){
48 visitFlag[p.x][p.y+1] = true;
49 sp.push(point(p.x,p.y+1));
50 }
51 if (p.x>0 && visitFlag[p.x-1][p.y]==false && board[p.x-1][p.y]=='O'){
52 visitFlag[p.x-1][p.y] = true;
53 sp.push(point(p.x-1,p.y));
54 }
55 if (p.y>0 && visitFlag[p.x][p.y-1]==false && board[p.x][p.y-1]=='O'){
56 visitFlag[p.x][p.y-1] = true;
57 sp.push(point(p.x,p.y-1));
58 }
59 }
60 char c = tF ? 'O':'X';
61 vector<point>::iterator vpi;
62 for (vpi=vp.begin(); vpi!=vp.end(); vpi++){
63 board[vpi->x][vpi->y] = c;
64 checkFlag[vpi->x][vpi->y] = tF;
65 }
66 }
67 }
68 };