zoukankan      html  css  js  c++  java
  • LeetCode-Surrounded Regions

    哎,做得比较郁闷的一道题,如果面试做这一题的话,肯定就跪了,一开始的时候思路就错了,只想着怎样把“O"变成"X",解的过程是遇到了"O"了再去判断,以dfs的方式遍历它四周的点,判断是否被"X"包围,如果被包围的话则改成"O"。只能过小数据,

    大数据会在一个超长的输入那里出现Runtime Error。

    后来到网上看了一下,发现正确的思路应该是用dfs或者bfs从外面一圈判断是否可连接到外面的”O",因为如果最外面一圈如果都是"X"的话,那么肯定是被包围的,所有的”O“都要被改成”X"。

    DFS的代码很好写,不过奇怪的是我写完之后过不了大数据,可是看了一位同学的代码(http://blog.csdn.net/tuantuanls/article/details/8746458),和我写的基本一样,可是却可以过,而且她的代码中没有判断r < 0 || c < 0,竟然还能通过,感觉很诡异。后来我把bfs中的局部变量m = board.size(); n = board[0].size();去掉之后就能通过了!⊙﹏⊙b汗,这也行。。。

     1 class Solution {
     2 public:
     3     void dfs(vector<vector<char> > &board, int r, int c) {
     4         //int m = board.size();
     5         //int n = board[0].size();
     6         //if (r < 0 || c < 0 || r >= m || c >= n || board[r][c] != 'O') return;
     7         if (r < 0 || c < 0 || r >= board.size()  || c >= board[0].size() || board[r][c] != 'O') {
     8             return;
     9         }
    10         board[r][c] = '#';
    11         dfs(board, r, c + 1);
    12         dfs(board, r, c - 1);
    13         dfs(board, r + 1, c);
    14         dfs(board, r - 1, c);
    15     }
    16     void solve(vector<vector<char> > &board) {
    17         // Start typing your C/C++ solution below
    18         // DO NOT write int main() function
    19         int m = board.size();
    20         if (m == 0) {
    21             return;
    22         }
    23         int n = board[0].size();
    24         for (int j = 0; j < n; j++) {
    25             dfs(board, 0, j);
    26             dfs(board, m - 1, j);
    27         }
    28         for (int i = 1; i < m - 1; i++) {
    29             dfs(board, i, 0);
    30             dfs(board, i, n - 1);
    31         }
    32         for (int i = 0; i < m; i++) {
    33             for (int j = 0; j < n; j++) {
    34                 if (board[i][j] == 'O') {
    35                     board[i][j] = 'X';
    36                 }
    37                 if (board[i][j] == '#') {
    38                     board[i][j] = 'O';
    39                 }
    40             }
    41         }
    42     }
    43 };

    用bfs的话可以一次顺利通过,队列我用的是C++ STL中的双端队列deque。

     1 class Solution {
     2 public:
     3     deque<int> around;
     4     void change(vector<vector<char> > &board, int r, int c) {
     5         if (r < 0 || c < 0 || r >= board.size()  || c >= board[0].size() || board[r][c] != 'O') {
     6             return;
     7         }
     8         board[r][c] = '1';
     9         around.push_back(r * board[0].size() + c);
    10     }
    11     void bfs(vector<vector<char> > &board, int r, int c) {
    12         change(board, r, c);
    13         while (!around.empty()) {
    14             int pos = around.front();
    15             int i = pos / board[0].size();
    16             int j = pos % board[0].size();
    17             change(board, i, j + 1);
    18             change(board, i, j - 1);
    19             change(board, i - 1, j);
    20             change(board, i + 1, j);
    21             around.pop_front();
    22         }
    23     }
    24     void solve(vector<vector<char> > &board) {
    25         // Start typing your C/C++ solution below
    26         // DO NOT write int main() function
    27         int m = board.size();
    28         if (m == 0) {
    29             return;
    30         }
    31         int n = board[0].size();
    32         around.clear();
    33         for (int j = 0; j < n; j++) {
    34             bfs(board, 0, j);
    35             bfs(board, m - 1, j);
    36         }
    37         for (int i = 1; i < m - 1; i++) {
    38             bfs(board, i, 0);
    39             bfs(board, i, n - 1);
    40         }
    41         for (int i = 0; i < m; i++) {
    42             for (int j = 0; j < n; j++) {
    43                 if (board[i][j] == 'O') {
    44                     board[i][j] = 'X';
    45                 }
    46                 if (board[i][j] == '1') {
    47                     board[i][j] = 'O';
    48                 }
    49             }
    50         }
    51     }
    52 };
  • 相关阅读:
    Proj THUDBFuzz Paper Reading: PMFuzz: Test Case Generation for Persistent Memory Programs
    入围 WF 后训练记
    算法竞赛历程
    2021 多校 杭电 第十场
    2021 多校 杭电 第九场
    2021 多校 牛客 第十场
    2021 多校 牛客 第九场
    2021 多校 杭电 第八场
    2021 多校 杭电 第六场
    2021 多校 杭电 第七场
  • 原文地址:https://www.cnblogs.com/chasuner/p/solve.html
Copyright © 2011-2022 走看看