Leetcode---Surrounded Regions

Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'.

A region is captured by flipping all 'O's into 'X's in that surrounded region.

For example,

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


After running your function, the board should be:

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



Have you been asked this question in an interview?

这道题直观看就是图论,然后是BFS或DFS,它们有同样的最坏时间复杂度,BFS消耗空间,空间复杂度比较高,DFS比较适合比较扁平的图(深度不大,广度大),BFS适合比较狭长的图(广度不大,深度大)。另外对于无权重图,BFS适合找最短路径,但只能记录一条最短路径;DFS能记录所有路径,但这些路径不一定是最短的。。。
等等吧,这些也是最近对BFS和DFS的一点总结。
这道题我使用了DFS,第一思路是正向思维,逐行扫描‘O’,然后以每个‘O’为起点DFS,扫到了染色‘O’为‘Y’,若碰到了矩阵的边,设置全局flag为true,然后替换‘Y’为‘Z’,若木有碰到边,设置全局变量flag为false,然后替换‘Y’为‘X’。最后将所有的‘Z’替换成‘O’。
写完一运行,TLS了。
后来参考别人的写法,采用逆向思维,从矩阵的四条边扫描, 以每个‘O’为起点DFS ,扫到了染色‘O’为‘Z’,扫描完毕后,所有剩下的‘O’就是被‘X’完全包围的, 将它们替换成‘X’,将所有的‘Z’替换成‘O’。
代码如下:

点击(此处)折叠或打开

  1. queue<int> q;
  2.     int m, n;
  3.       
  4.     void add(int x, int y, vector<vector<char>> &board) {
  5.         if (x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'O') {
  6.             board[x][y] = 'Z';
  7.             q.push(x * n + y);
  8.         }
  9.     }
  10.       
  11.     void traversal(int x, int y, vector<vector<char>> &board) {
  12.         add(x, y, board);
  13.         while (!q.empty()) {
  14.             int p = q.front();
  15.             q.pop();
  16.             int px = p / n, py = p % n;
  17.             add(px - 1, py, board);
  18.             add(px + 1, py, board);
  19.             add(px, py - 1, board);
  20.             add(px, py + 1, board);
  21.         }
  22.     }
  23.       
  24.     void solve(vector<vector<char>> &board) {
  25.         if (board.empty() || board.size() == 0 || board[0].size() == 0) {
  26.             return;
  27.         }
  28.         m = board.size(), n = board[0].size();
  29.         for (int i = 0; i < n; i++) {
  30.             traversal(0, i, board);
  31.             traversal(m - 1, i, board);
  32.         }
  33.         for (int i = 0; i < m; i++) {
  34.             traversal(i, 0, board);
  35.             traversal(i, n - 1, board);
  36.         }
  37.         for (int i = 0; i < m; i++) {
  38.             for (int j = 0; j < n; j++) {
  39.                 board[i][j] = board[i][j] == 'Z' ? 'O' : 'X';
  40.             }
  41.         }
  42.     }


<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(1) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值