• LeetCode OJ


    我觉得这道题和传统的用动规或者贪心等算法的题目不同。按照题目的意思,就是将被‘X’围绕的‘O’区域找出来,然后覆盖成‘X’。

    那问题就变成两个子问题:

    1. 找到‘O’区域,可能有多个区域,每个区域‘O’都是相连的;

    2. 判断‘O’区域是否是被‘X’包围。

    我采用树的宽度遍历的方法,找到每一个‘O’区域,并为每个区域设置一个value值,为0或者1,1表示是被‘X’包围,0则表示不是。是否被‘X’包围就是看‘O’区域的边界是否是在2D数组的边界上。

    下面是具体的AC代码:

    class BoardNode{
        int x;
        int y;
        public BoardNode(int x, int y){
            this.x = x;
            this.y = y;
        }
    }
     1 /**
     2      * Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'.
     3      * A region is captured by flipping all 'O's into 'X's in that surrounded region.
     4      * @param board
     5      */
     6     public void solve(char[][] board){
     7         //empty 2D board
     8         if(board.length == 0)
     9             return;
    10         //if value == 1,means the group is surrended by 'X', if value == 0 , means it is not
    11         HashMap<LinkedList<BoardNode>, Integer> groups = new HashMap<LinkedList<BoardNode>, Integer>();
    12         int xB = board.length;
    13         int yB = board[0].length;
    14         if(xB == 1 || yB == 1)
    15             return;
    16         boolean[][] flag = new boolean[xB][yB];
    17         for(int i=0;i<xB;i++)
    18             for(int j=0;j<yB;j++)
    19                 flag[i][j] = true;
    20         for(int i=0;i<xB;i++)
    21         {
    22             for(int j=0;j<yB;j++){
    23                 if(board[i][j]=='O' && flag[i][j])
    24                 {
    25                     //a new group
    26                     LinkedList<BoardNode> tree = new LinkedList<BoardNode>();
    27                     //the corresponding value of the group
    28                     int value = 1;
    29                     if(i==0 || i==xB-1 || j==0 || j==yB-1)
    30                         value = 0;
    31                     //bread first search for the group
    32                     tree.offer(new BoardNode(i,j));
    33                     flag[i][j] = false;
    34                     int point = 0;
    35                     while(point<tree.size()){
    36                         BoardNode temp = tree.get(point++);
    37                         //left neighbor
    38                         if(temp.y+1==yB-1 && board[temp.x][temp.y+1]== 'O')
    39                             value = 0;
    40                         if(temp.y+1<yB && flag[temp.x][temp.y+1] && board[temp.x][temp.y+1]== 'O')
    41                         {
    42                             flag[temp.x][temp.y+1] = false;
    43                             tree.offer(new BoardNode(temp.x,temp.y+1));
    44                         }
    45                         //down neighbor
    46                         if(temp.x+1 == xB-1 && board[temp.x+1][temp.y] == 'O')
    47                             value = 0;
    48                         if(temp.x+1<xB && flag[temp.x+1][temp.y] && board[temp.x+1][temp.y] == 'O')
    49                         {
    50                              flag[temp.x+1][temp.y]=false;
    51                             tree.offer(new BoardNode(temp.x+1,temp.y));
    52                         }
    53                         //up neighbor
    54                         if(temp.x-1 == 0 && board[temp.x-1][temp.y]=='O')
    55                             value = 0;
    56                         if(temp.x-1>=0 && flag[temp.x-1][temp.y] && board[temp.x-1][temp.y] == 'O'){
    57                             flag[temp.x-1][temp.y]=false;
    58                             tree.offer(new BoardNode(temp.x-1,temp.y));
    59                         }
    60                         //left neighbor
    61                         if(temp.y-1==0 && board[temp.x][temp.y-1]=='O')
    62                             value = 0;
    63                         if(temp.y-1>=0 && flag[temp.x][temp.y-1] && board[temp.x][temp.y-1]=='O')
    64                         {
    65                             flag[temp.x][temp.y-1] = false;
    66                             tree.offer(new BoardNode(temp.x,temp.y-1));
    67                         }
    68                     }
    69                     groups.put(tree, value);
    70                 }
    71             }
    72         }
    73         //flipping the region surrounded by 'X'
    74         for(Entry<LinkedList<BoardNode>,Integer> e: groups.entrySet())
    75         {
    76             if(e.getValue() == 1)
    77             {
    78                 for(BoardNode bn : e.getKey())
    79                     board[bn.x][bn.y] = 'X';
    80             }
    81         }
    82     }
    有问题可以和我联系,bettyting2010#163 dot com
  • 相关阅读:
    Leetcode刷题记录:构建最大数二叉树
    Leetcode刷题记录:编码并解码短网址
    Python获取数字的二进制值
    SQL文件的BOM问题导致的invalid character错误及解决
    修改服务的运行权限,解决SVN Post Commit问题
    将iPod中的音乐拷贝到Mac中
    Linux下创建可执行bin安装文件
    Mac下使用XLD转换无损音乐Ape
    Mac环境下配置Tomcat+Eclipse
    Curl操作Elasticsearch的常用方法
  • 原文地址:https://www.cnblogs.com/echoht/p/3694569.html
Copyright © 2020-2023  润新知