https://oj.leetcode.com/problems/surrounded-regions/
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
这是一个搜索问题,这个题本身不难,但是我第一次做的时候没有AC,主要是我第一次用的是递归操作,然后栈溢出了,最后我用一个数组来模拟一个队列,将递归转化为类迭代的方式。
public class Solution {
public void bfs(char [][]board,int [][]matrix,int u,int v,int count){
int n = board.length;
int m = board[0].length;
ArrayList<Point>arrayList = new ArrayList<Point>();
Point point = new Point();
point.x = u;
point.y = v;
arrayList.add(point);
while(!arrayList.isEmpty()){
point = arrayList.remove(0);
if(point.x+1<n&&board[point.x+1][point.y]=='O'&&matrix[point.x+1][point.y]==0){
matrix[point.x+1][point.y] = count;
Point point2 = new Point();
point2.x = point.x+1;
point2.y = point.y;
arrayList.add(point2);
}
if(point.x-1>=0&&board[point.x-1][point.y]=='O'&&matrix[point.x-1][point.y]==0){
matrix[point.x-1][point.y] = count;
Point point2 = new Point();
point2.x = point.x-1;
point2.y = point.y;
arrayList.add(point2);
}
if(point.y+1<m&&board[point.x][point.y+1]=='O'&&matrix[point.x][point.y+1]==0){
matrix[point.x][point.y+1] = count;
Point point2 = new Point();
point2.x = point.x;
point2.y = point.y+1;
arrayList.add(point2);
}
if(point.y-1>=0&&board[point.x][point.y-1]=='O'&&matrix[point.x][point.y-1]==0){
matrix[point.x][point.y-1] = count;
Point point2 = new Point();
point2.x = point.x;
point2.y = point.y-1;
arrayList.add(point2);
}
}
}
public void solve(char[][] board) {
if(board==null)return;
int n = board.length;
if(n==0)return;
int m = board[0].length;
if(m==0)return;
int [][]matrix = new int [n][m];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
matrix[i][j]=0;
}
}
int count=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(board[i][j]=='O'&&matrix[i][j]==0){
matrix[i][j]=++count;
bfs(board, matrix, i, j, count);
}
}
}
boolean [] change = new boolean [count+1];
for(int i=1;i<=count;i++){
change[i] = true;
}
for(int i=0;i<m;i++){
change[matrix[0][i]] = false;
change[matrix[n-1][i]] = false;
}
for(int i=0;i<n;i++){
change[matrix[i][0]] = false;
change[matrix[i][m-1]] = false;
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(change[matrix[i][j]]&&board[i][j]=='O'){
board[i][j] = 'X';
}
}
}
}
}