Chinaunix首页 | 论坛 | 博客
  • 博客访问: 117335
  • 博文数量: 53
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 620
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-24 16:22
文章存档

2014年(53)

我的朋友

分类: C/C++

2014-09-22 17:46:06

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


阅读(887) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~