Problem:

Given a 2D board containing 'X' and 'O' (the letter 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,

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

After running your function, the board should be:

  1. X X X X
  2. X X X X
  3. X X X X
  4. X O X X
  1. /**
  2. * Created by sunny on 7/24/17.
  3. */
  4. import java.util.*;
  5. public class Solution {
  6. public void solve(char[][] board) {
  7. if (board == null || board.length == 0) {
  8. return;
  9. }
  10. //首先将第一列和最后一列的O变为#
  11. for(int i = 0;i<board.length;i++){
  12. //这是按行遍历
  13. fill(board, i, 0);
  14. fill(board, i, board[i].length-1);
  15. }
  16. //将第一行和最后一行的O变为#
  17. for (int i = 0; i < board[0].length; i++) {
  18. fill(board, 0, i);
  19. fill(board, board.length-1, i);
  20. }
  21. //遍历整个数组,o变为X,#变为O
  22. for (int i = 0; i < board.length; i++) {
  23. for (int j = 0; j < board[i].length; j++) {
  24. if (board[i][j] == 'O') {
  25. board[i][j] = 'X';
  26. }else if(board[i][j] == '#'){
  27. board[i][j] ='O';
  28. }
  29. }
  30. }
  31. }
  32. private void fill(char[][] board,int row,int col) {
  33. if (board[row][col] == 'X') {
  34. return ;
  35. }
  36. board[row][col] = '#';
  37. Queue<Integer> queue = new LinkedList<>();
  38. //需要将元素的位置存储到 队列中 行和列
  39. int code = row * board[0].length + col;
  40. queue.add(code);
  41. while(!queue.isEmpty()){
  42. //找到这个元素
  43. int temp = queue.poll();
  44. //第几行
  45. int i = temp/board[0].length;
  46. //第几列
  47. int j = temp%board[0].length;
  48. //看这个元素的四个周是不是O,上边
  49. if(i-1>=0&&board[i-1][j] == 'O'){
  50. board[i-1][j] = '#';
  51. queue.add((i-1)*board[0].length+j);
  52. }
  53. if (i+1<board.length&&board[i+1][j] == 'O') {
  54. board[i+1][j] = '#';
  55. queue.add((i+1)*board[0].length+j);
  56. }
  57. if (j-1>=0&&board[i][j-1] == 'O') {
  58. board[i][j-1] = '#';
  59. queue.add(i*board[0].length+j-1);
  60. }
  61. if (j+1<board[0].length&&board[i][j+1]=='O') {
  62. board[i][j+1] = '#';
  63. queue.add(i*board[0].length+j+1);
  64. }
  65. }
  66. }
  67.  
  68. public static void main(String[] args) {
  69. Scanner scanner = new Scanner(System.in);
  70. char[][] board = new char[][]{
  71. {'X','X','X','X'},
  72. {'X','O','O','O'},
  73. {'X','O','X','X'},
  74. {'X','X','X','X'}
  75. };
  76. Solution solution = new Solution();
  77. solution.solve(board);
  78. for(int i=0;i<board.length;i++){
  79. for(int j=0;j<board[i].length;j++){
  80. System.out.print(board[i][j]);
  81. }
  82. System.out.println();
  83. }
  84. }
  85. }

采用广度优先遍历求解。---队列的应用

leetCode130. Surrounded Regions--广度优先遍历算法的更多相关文章

  1. 《图论》——广度优先遍历算法(BFS)

    十大算法之广度优先遍历: 本文以实例形式讲述了基于Java的图的广度优先遍历算法实现方法,详细方法例如以下: 用邻接矩阵存储图方法: 1.确定图的顶点个数和边的个数 2.输入顶点信息存储在一维数组ve ...

  2. 图的广度优先遍历算法(BFS)

    在上一篇文章我们用java演示了图的数据结构以及图涉及到的深度优先遍历算法,本篇文章将继续演示图的广度优先遍历算法.广度优先遍历算法主要是采用了分层的思想进行数据搜索.其中也需要使用另外一种数据结构队 ...

  3. python、java实现二叉树,细说二叉树添加节点、深度优先(先序、中序、后续)遍历 、广度优先 遍历算法

    数据结构可以说是编程的内功心法,掌握好数据结构真的非常重要.目前基本上流行的数据结构都是c和c++版本的,我最近在学习python,尝试着用python实现了二叉树的基本操作.写下一篇博文,总结一下, ...

  4. 【图的遍历】广度优先遍历(DFS)、深度优先遍历(BFS)及其应用

    无向图满足约束条件的路径 •[目的]:掌握深度优先遍历算法在求解图路径搜索问题的应用 [内容]:编写一个程序,设计相关算法,从无向图G中找出满足如下条件的所有路径:  (1)给定起点u和终点v.  ( ...

  5. 图的深度优先遍历(DFS)和广度优先遍历(BFS)

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  6. 饥饿的小易(枚举+广度优先遍历(BFS))

    题目描述 小易总是感觉饥饿,所以作为章鱼的小易经常出去寻找贝壳吃.最开始小易在一个初始位置x_0.对于小易所处的当前位置x,他只能通过神秘的力量移动到 4 * x + 3或者8 * x + 7.因为使 ...

  7. 邻接矩阵c源码(构造邻接矩阵,深度优先遍历,广度优先遍历,最小生成树prim,kruskal算法)

    matrix.c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include < ...

  8. 图的建立(邻接矩阵)+深度优先遍历+广度优先遍历+Prim算法构造最小生成树(Java语言描述)

    主要参考资料:数据结构(C语言版)严蔚敏   ,http://blog.chinaunix.net/uid-25324849-id-2182922.html   代码测试通过. package 图的建 ...

  9. python算法-二叉树广度优先遍历

    广度优先遍历:优先遍历兄弟节点,再遍历子节点 算法:通过队列实现-->先进先出 广度优先遍历的结果: 50,20,60,15,30,70,12 程序遍历这个二叉树: # encoding=utf ...

随机推荐

  1. GDB Core,gdb 调试大全,core文件调试

    编译: gcc -g -o hello hello.c gdb 调试: 基本 gdb 命令. 命 令 描 述 小结:常用的gdb命令 backtrace 显示程序中的当前位置和表示如何到达当前位置的栈 ...

  2. c语言%.*s是什么

    int i; ;i<;i++) printf("%.*s%s\n", i, " ", "########"); ; *用来指定宽度,对 ...

  3. WordPress 中文图片 上传 自动重命名

    由于国人很少有在上传图片前将图片名重命名为英语的,所以自动重命名对于WP来说尤为重要,特别是LINUX的不支持中文名的. WordPress上传多媒体的代码都存放于\wp-admin\includes ...

  4. spark gateway引发:跟踪Cloudera安装服务异常日志跟踪

    spark gateway是用于接收cloudera管理的应用:可以上报数据,不影响正常使用.启动gateway失败,我觉得可能是因为配置问题? 这个问题可能比较深,因为我通过查看日志(clouder ...

  5. CentOS 7安装Azcopy

    Azcopy是Azure存储一个非常好用的工具.本文将介绍如何在CentOS7下安装的过程. 更新:目前需要.net core 2.0版本.具体下载地址大家自己搜索. 1 安装.net core 1. ...

  6. TFSEclipsePlugin-UpdateSiteArchive 手动拷贝

  7. 学习vue

    一,声明模板的时候需要新建示例 如下代码 <div id="app"> <my></my> </div> Vue.component ...

  8. .Net 一直在改变

    Microsoft 微软又进一步了,每天都有惊喜. MSDN,是微软官网开发者技术支持网络,今天给我一个小惊喜,不多说直接上图.分享给大家 右键新打开Tab选项,就能看到官方的源码实现.为我们学习提供 ...

  9. 火星坐标、百度坐标、WGS84坐标转换代码(JS)

    JS版本源码 /** * Created by Wandergis on 2015/7/8. * 提供了百度坐标(BD09).国测局坐标(火星坐标,GCJ02).和WGS84坐标系之间的转换 */ / ...

  10. 关于python+django操作数据库中的表

    数据库中的表示这样设计的 class C(models.Model): name = models.CharField(max_length=32) class B(models.Model): na ...