Leetcode 130 Surrounded Regions DFS

将内部的O点变成X

input

X X X X
X O O X
X X O X
X O X X

output

X X X X
X X X X
X X X X
X O X X

DFS的基本框架是

 1 void dfs(int now,int d){
 2       if(终止条件) {
 3           做相应的操作;
 4            return;
 5       }
 6        for(遍历所有now点的相邻点next){
 7             if(!visit[next]) {
 8                  访问每个没有访问过的点;
 9                  做相应的操作;
10                  dfs(next, d + 1);
11             }
12          }         
13   }
14     

DFS图所有边上的点,将边上的O以及其联通域变为T,然后将内部的O变为X,外部的T变为O,本质是种子填充算法。

此题对于is_in这个函数要注意, 不要用(x < m) && (x >= 0) && (y < n) && (y >= 0) 会堆栈溢出!!原因是会出现边上的点全是O。。。

 1 class Solution {
 2 public:
 3     
 4     int m, n;
 5     bool is_in(int x, int y)
 6     {
 7         return (x < m-1) && (x >= 1) && (y < n-1) && (y >= 1);
 8     }
 9 
10     void dfs(std::vector<std::vector<char>> &board,int x,int y)
11     {
12         //if (!(is_in(x, y) && board[x][y] == 'O')) return;
13         //printf("%d %d\n", x, y);
14         board[x][y] = 'T';
15         int dir[4][2] = { { 1, 0 }, { -1, 0 }, { 0, 1 }, { 0, -1 } };
16         for (int i = 0; i < 4; ++i){
17             int tx = x + dir[i][0];
18             int ty = y + dir[i][1];
19             if (is_in(tx, ty) && board[tx][ty] == 'O')
20             {
21                 dfs(board, tx, ty);
22             }
23         }
24     }
25 
26     void change(std::vector<std::vector<char>> &board)
27     {
28         for (int i = 0; i < m;++i){
29             for (int j = 0; j < n;++j){
30                 if (board[i][j] == 'T') board[i][j] = 'O';
31                 else if (board[i][j] == 'O') board[i][j] = 'X';
32                 else;
33             }
34         }
35     }
36 
37     void solve(std::vector<std::vector<char>> &board)
{
38 m = board.size(); 39 if (m == 0) return; 40 n = board[0].size(); 41 if (n == 0) return; 42 for (int i = 0; i < m;++i){ 43 if (board[i][0] == 'O') dfs(board, i, 0); 44 if (board[i][n - 1] == 'O') dfs(board, i, n-1); 45 } 46 for (int i = 0; i < n; ++i){ 47 if (board[0][i] == 'O') dfs(board, 0, i); 48 if (board[m-1][i] == 'O') dfs(board, m-1, i); 49 } 50 change(board); 51 } 52 };

 

posted @ 2016-01-15 10:56  Breeze0806  阅读(248)  评论(0编辑  收藏  举报