问题描述:
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.
解题思路:
广度优先搜索,如果在边界发现一个‘O’,对其进行搜索。
代码如下:
/**
*题号130
* @param board 一个字符二维数组
*和边缘相连的所有O都不会被改变,其余的都会被改变
*/
public void solve(char[][] board) {
int row=board.length;
if (row==0){
return;
}
int col=board[0].length;
for (int i = 0; i < row; i++) {
for (int j = 0; j <col ; j++) {
if (i==0||j==0||i==row-1||j==col-1){
if (board[i][j]=='O'){
bfsSolve(board,i,j);
}
}
}
}
for (int i = 0; i <row ; i++) {
for (int j = 0; j <col ; j++) {
if (board[i][j]=='*'){
board[i][j]='O';
}else {
board[i][j]='X';
}
}
}
}
class Pair{
int i;
int j;
Pair(int i,int j){
this.i=i;
this.j=j;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Pair)){
return false;
}
return this.i==((Pair) obj).i&&this.j==((Pair) obj).j;
}
}
/**
* 如果i,j处为O,而且满足相应的要求,那么就进行广度优先搜索
* @param board
* @param i
* @param j
*/
private void bfsSolve(char[][] board,int i,int j){
Queue<Pair> queue=new LinkedList<>();
queue.offer(new Pair(i,j));
board[i][j]='*';
while (!queue.isEmpty()){
Pair pair=queue.poll();
int pi=pair.i;
int pj=pair.j;
if (pi>0&&board[pi-1][pj]=='O'){
queue.offer(new Pair(pi-1,pj));
//加入队列就应该修改其值,否则可能无限次加入
board[pi-1][pj]='*';
}
if (pj>0&&board[pi][pj-1]=='O'){
queue.offer(new Pair(pi,pj-1));
board[pi][pj-1]='*';
}
if (pi<board.length-1&&board[pi+1][pj]=='O'){
queue.offer(new Pair(pi+1,pj));
board[pi+1][pj]='*';
}
if (pj<board[0].length-1&&board[pi][pj+1]=='O'){
queue.offer(new Pair(pi,pj+1));
board[pi][pj+1]='*';
}
}
}
第一次提交博客,多多见谅