zoukankan      html  css  js  c++  java
  • 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
    ", 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 };
  • 相关阅读:
    GITHUB随笔 15-5月 junit
    github心得
    (转)哪个瞬间让你突然觉得逛知乎真有用?
    0-1背包问题(the knapsack problem)
    对VSCode在安装了Dev-cpp的电脑上的配置
    非全日制考研资料(未完待续)
    CSS那些事读书笔记-2
    CSS那些事读书笔记-1
    前端面试准备-1
    工作日记-一个有趣的定时任务实现
  • 原文地址:https://www.cnblogs.com/onlyac/p/5132661.html
Copyright © 2011-2022 走看看