被围绕的区域

给一个二维的矩阵,包含 'X' 和 'O', 找到所有被 'X' 围绕的区域,并用 'X' 填充满。

样例

给出二维矩阵:

  1. X X X X
  2. X O O X
  3. X X O X
  4. X O X X

把被 'X' 围绕的区域填充之后变为:

  1. X X X X
  2. X X X X
  3. X X X X
  4. X O X X
  5. 解题
    参考岛屿的个数 然而我还是写不出来
    programcreek 有下面的一段话:

This problem is similar to Number of Islands. In this problem, only the cells on the
boarders can not be surrounded. So we can first merge those O’s on the boarders like
in Number of Islands and replace O’s with ’#’, and then scan the board and replace all
O’s left (if any)

先将边界中联通的O换成*,这里利用深度优先

最后遍历数组,O->X  *->O,每个位置值遍历一次,不会出现混乱

  1. public class Solution {
  2. /**
  3. * @param board a 2D board containing 'X' and 'O'
  4. * @return void
  5. */
  6. public void surroundedRegions(char[][] board) {
  7. // Write your code here
  8. if(board == null || board.length == 0|| board[0].length == 0)
  9. return ;
  10. int row = board.length;
  11. int col = board[0].length;
  12. for(int i =0;i< row;i++){
  13. if(board[i][0] == 'O')
  14. merge(board,i,0);
  15. if(board[i][col-1] == 'O')
  16. merge(board,i,col-1);
  17. }
  18. for(int j =0;j< col;j++){
  19. if(board[0][j] == 'O')
  20. merge(board,0,j);
  21. if(board[row-1][j] == 'O')
  22. merge(board,row-1,j);
  23. }
  24. // O->X *->O
  25. for(int i=0;i<row;i++){
  26. for(int j=0; j<col; j++){
  27. if(board[i][j] == 'O'){
  28. board[i][j] = 'X';
  29. }else if(board[i][j] == '*'){
  30. board[i][j] = 'O';
  31. }
  32. }
  33. }
  34. }
  35. // 将边界联通的O 换成 *
  36. public void merge(char[][] board,int row,int col){
  37. if(row<0 || col<0 || row>= board.length || col>= board[0].length)
  38. return;
  39. if(board[row][col] != 'O')
  40. return;
  41. board[row][col] = '*';
  42. merge(board,row,col+1);
  43. merge(board,row+1,col);
  44. merge(board,row-1,col);
  45. merge(board,row,col-1);
  46. }
  47. }
  1. This solution causes java.lang.StackOverflowError, because for a large board, too many method calls are pushed to the stack and causes the overflow.

programcreek 中又给了一个广度优先的算法

比较复杂,先把程序复杂过来

  1. public class Solution {
  2. // use a queue to do BFS
  3. private Queue<Integer> queue = new LinkedList<Integer>();
  4.  
  5. public void solve(char[][] board) {
  6. if (board == null || board.length == 0)
  7. return;
  8.  
  9. int m = board.length;
  10. int n = board[0].length;
  11.  
  12. // merge O's on left & right boarder
  13. for (int i = 0; i < m; i++) {
  14. if (board[i][0] == 'O') {
  15. bfs(board, i, 0);
  16. }
  17.  
  18. if (board[i][n - 1] == 'O') {
  19. bfs(board, i, n - 1);
  20. }
  21. }
  22.  
  23. // merge O's on top & bottom boarder
  24. for (int j = 0; j < n; j++) {
  25. if (board[0][j] == 'O') {
  26. bfs(board, 0, j);
  27. }
  28.  
  29. if (board[m - 1][j] == 'O') {
  30. bfs(board, m - 1, j);
  31. }
  32. }
  33.  
  34. // process the board
  35. for (int i = 0; i < m; i++) {
  36. for (int j = 0; j < n; j++) {
  37. if (board[i][j] == 'O') {
  38. board[i][j] = 'X';
  39. } else if (board[i][j] == '#') {
  40. board[i][j] = 'O';
  41. }
  42. }
  43. }
  44. }
  45.  
  46. private void bfs(char[][] board, int i, int j) {
  47. int n = board[0].length;
  48.  
  49. // fill current first and then its neighbors
  50. fillCell(board, i, j);
  51.  
  52. while (!queue.isEmpty()) {
  53. int cur = queue.poll();
  54. int x = cur / n;
  55. int y = cur % n;
  56.  
  57. fillCell(board, x - 1, y);
  58. fillCell(board, x + 1, y);
  59. fillCell(board, x, y - 1);
  60. fillCell(board, x, y + 1);
  61. }
  62. }
  63.  
  64. private void fillCell(char[][] board, int i, int j) {
  65. int m = board.length;
  66. int n = board[0].length;
  67. if (i < 0 || i >= m || j < 0 || j >= n || board[i][j] != 'O')
  68. return;
  69.  
  70. // add current cell is queue & then process its neighbors in bfs
  71. queue.offer(i * n + j);
  72. board[i][j] = '#';
  73. }
  74. }

update

  1. public class Solution {
  2. /**
  3. * @param board a 2D board containing 'X' and 'O'
  4. * @return void
  5. */
  6. public void surroundedRegions(char[][] board) {
  7. // Write your code here
  8. if(board == null || board.length == 0 || board[0].length ==0)
  9. return;
  10. int row = board.length;
  11. int col = board[0].length;
  12. // 边界的 O 变为 P
  13. for(int i =0;i<row;i++){
  14. if(board[i][0] == 'O')
  15. dfs(board,i,0,row,col);
  16. if(board[i][col-1] == 'O')
  17. dfs(board,i,col-1,row,col);
  18. }
  19. for(int j=0;j<col;j++){
  20. if(board[0][j] == 'O')
  21. dfs(board,0,j,row,col);
  22. if(board[row-1][j] == 'O')
  23. dfs(board,row-1,j,row,col);
  24.  
  25. }
  26. // 中间的 O-> X
  27. for(int i=0;i<row;i++){
  28. for(int j=0;j<col;j++){
  29. if(board[i][j] == 'O')
  30. board[i][j] = 'X';
  31. }
  32. }
  33. // P 还原 O
  34. for(int i=0;i<row;i++){
  35. for(int j=0;j<col;j++){
  36. if(board[i][j] == 'P')
  37. board[i][j] = 'O';
  38. }
  39. }
  40. }
  41. // 将 ij 周围的 O - > P
  42.  
  43. public void dfs(char[][] board,int i,int j,int row,int col){
  44. if(i<0 ||i>=row ||j<0 ||j>=col)
  45. return ;
  46. if(board[i][j]=='O'){
  47. board[i][j] ='P';
  48. dfs(board,i+1,j,row,col);
  49. dfs(board,i,j+1,row,col);
  50. dfs(board,i-1,j,row,col);
  51. dfs(board,i,j-1,row,col);
  52. }
  53. }
  54. }

lintcode:被围绕的区域的更多相关文章

  1. lintcode - 被围绕的区域

    class Solution { public: /* * @param board: board a 2D board containing 'X' and 'O' * @return: nothi ...

  2. [Swift]LeetCode130. 被围绕的区域 | Surrounded Regions

    Given a 2D board containing 'X' and 'O' (the letter O), capture all regions surrounded by 'X'. A reg ...

  3. 【1】【leetcode-130】 被围绕的区域

    (DFS思路对,写复杂了) 给定一个二维的矩阵,包含 'X' 和 'O'(字母 O). 找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充. 示例: X X X X X O ...

  4. 286被围绕的区域 · Surrounded Regions

    [抄题]: 给一个二维的矩阵,包含 'X' 和 'O', 找到所有被 'X' 围绕的区域,并用 'X' 填充满. 样例 给出二维矩阵: X X X X X O O X X X O X X O X X ...

  5. lintcode-477-被围绕的区域

    477-被围绕的区域 给一个二维的矩阵,包含 'X' 和 'O', 找到所有被 'X' 围绕的区域,并用 'X' 填充满. 样例 给出二维矩阵: X X X X X O O X X X O X X O ...

  6. 130 Surrounded Regions 被围绕的区域

    给定一个二维的矩阵,包含 'X' 和 'O'(字母 O), 找到所有被 'X' 围绕的区域.并将区域里所有 'O'用 'X' 填充.例如,X X X XX O O XX X O XX O X X运行你 ...

  7. Leetcode之深度优先搜索(DFS)专题-130. 被围绕的区域(Surrounded Regions)

    Leetcode之深度优先搜索(DFS)专题-130. 被围绕的区域(Surrounded Regions) 深度优先搜索的解题详细介绍,点击 给定一个二维的矩阵,包含 'X' 和 'O'(字母 O) ...

  8. LeetCode 被围绕的区域

    给定一个二维的矩阵,包含 'X' 和 'O'(字母 O). 找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充. 示例: X X X X X O O X X X O X X ...

  9. LeetCode 130. 被围绕的区域(Surrounded Regions)

    题目描述 给定一个二维的矩阵,包含 'X' 和 'O'(字母 O). 找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充. 示例: X X X X X O O X X X ...

随机推荐

  1. 如何在github上fork一个项目来贡献代码以及同步原作者的修改

    [-] 如何贡献自己的力量 如何让自己的项目与原作者的项目保持同步 作为一个IT人,通过github进行学习是最快的成长手 段.我们可以浏览别人的优秀代码.但只看不动手还是成长得很慢,因此为别人贡献代 ...

  2. RHEL6.4找回root密码的方法

    1.先在系统启动的时候提示:press any key to enter menu 时按下e键(其实其他键也可以,只不过我习惯e键而已) 2.进入如下界面: 3.按上下箭头方向键选中第二项,按e键,进 ...

  3. JPA学习---第十一节:JPA中的多对多双向关联实体定义与注解设置及操作

    1.定义实体类,代码如下: (1).学生实体类: package learn.jpa.entity; import java.util.HashSet; import java.util.Set; i ...

  4. 最大后验估计(MAP)

    最大后验估计是根据经验数据获得对难以观察的量的点估计.与最大似然估计类似,但是最大的不同时,最大后验估计的融入了要估计量的先验分布在其中.故最大后验估计可以看做规则化的最大似然估计. 首先,我们回顾上 ...

  5. Daily Scrum4

    今天我们小组开会内容分为以下部分: part1:与负责这个项目的其他组进行会晤; part2:组内成员召开了简短会议,进行工作安排; part3:总结今日工作,对项目遇到的问题商讨解决办法; ◆Par ...

  6. Gentoo 网络接口配置文件说明

    裁剪的Gentoo系统,仅供公司内部使用! [作为备份档案] 网络接口配置:/etc/conf.d/net #设置静态IPconfig_eth0="192.168.1.x/24" ...

  7. Codeforces Round #350 (Div. 2) E. Correct Bracket Sequence Editor 模拟

    题目链接: http://codeforces.com/contest/670/problem/E 题解: 用STL的list和stack模拟的,没想到跑的还挺快. 代码: #include<i ...

  8. 【Ural】【1519】Formula 1

    插头DP 本题为CDQ<基于连通性状态压缩的动态规划的……(我忘了)>里的例题!(嗯就是这样……) 先膜拜一下ccy大神……http://blog.sina.com.cn/s/blog_5 ...

  9. shadowmap 及优化

    对于子阴影的走样, 条纹 开zbias resterizeState zbias = 1000...大概这样 另一个方法是画背面 backface是指一个人肚子那面,后背那面 而不是肚子的里面那层 所 ...

  10. [百度空间] [转]将程序移植到64位Windows

    from : http://goooder.bokee.com/2000373.html (雷立辉 整理) 简介:本文对如何将32位Windows程序平滑的支持和过渡到64位Windows操作系统做出 ...