代码改变世界

leetcode - Surrounded Regions

2013-12-10 17:57  张汉生  阅读(181)  评论(0编辑  收藏  举报

 

 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 };