首页 > 代码库 > LeetCode OJ - Surrounded Regions

LeetCode OJ - Surrounded Regions

我觉得这道题和传统的用动规或者贪心等算法的题目不同。按照题目的意思,就是将被‘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 =http://www.mamicode.com/= 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 = http://www.mamicode.com/1;
29                     if(i==0 || i==xB-1 || j==0 || j==yB-1)
30                         value = http://www.mamicode.com/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 = http://www.mamicode.com/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 = http://www.mamicode.com/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 = http://www.mamicode.com/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 = http://www.mamicode.com/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     }