package com.ytx.array;
/**130题
* 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
*
* 给你一块2维的包含'X'或者'O'的板,找到所有被'X'包围的区域, 把区域内的‘O‘翻转成’X’。
* @author yuantian xin
*
*思路:连通性问题,用dfs和bfs都可以解决。逆向思维,求所有封闭的O,可以先求出所有连通的O,保存起来,再把其它的O改成X即可。只有在从边界上
*连通的O才不会被X封闭。所以从边界上四条边界上进行深搜或者广搜,找到所有连通的O。
*/
public class Surrounded_regions {
//二维矩阵的行数
public int rowNum;
//二维矩阵的列数
public int colNum;
/**
* 利用深搜从边界上开始找,找到所有与边界上O连通的所有O,
* 把所有连通的O变成*保存起来,那么剩下的O都是封闭的,被X包围的
* @param index_x 二维数组的索引行
* @param index_y 二维数据的索引列
* @param board 二维数据
*/
public void dfs(int index_x, int index_y, char board[][]) {
if(board[index_x][index_y] == 'O') {
//是O才继续往下找,把所有连通的O都变成*,之后再变回来
board[index_x][index_y] = '*';
//向上找
if(index_x > 1) {
dfs(index_x - 1,index_y, board);
}
//向下找
if(index_x < rowNum - 1) {
dfs(index_x+1, index_y, board);
}
//向左找
if(index_y > 1) {
dfs(index_x, index_y - 1, board);
}
//向右找
if(index_y < colNum -1) {
dfs(index_x, index_y + 1, board);
}
}
}
/**
* 解决的办法,找到所有与边界上的O连通的O,改成*,剩下的不连通的
* 改成X,最后把*变回O即可
* @param board
*/
public void solve(char[][] board) {
if(board == null || board.length <= 0 || board[0].length <= 0) {
return ;
}
rowNum = board.length;
colNum = board.length;
//从第0列和最后一列开始找,递归深搜
for(int i = 0; i < rowNum; i++) {
dfs(i,0,board);
dfs(i,colNum - 1, board);
}
//从第一行和最后一行开始找
for(int j = 0; j < colNum; j++) {
dfs(0,j,board);
dfs(rowNum - 1, j, board);
}
//遍历二维数组,剩下不连通的O全部变成X,把*变回O。
for(int i = 0; i < rowNum; i++) {
for(int j = 0; j < colNum; j++) {
if(board[i][j] == 'O') {
board[i][j] = 'X';
}
if(board[i][j] == '*') {
board[i][j] ='O';
}
}
}
}
public static void main(String[] args) {
char board [][] ={{'X','X','X','X'},{'X','O','O','X'},{'X','X','O','X'},{'X','O','X','X'}};
for(int i = 0; i < board.length; i++) {
for(int j = 0; j < board[0].length; j++) {
System.out.print(board[i][j] + " ");
}
System.out.println("");
}
System.out.println("---------");
Surrounded_regions sr = new Surrounded_regions();
sr.solve(board);
for(int i = 0; i < board.length; i++) {
for(int j = 0; j < board[0].length; j++) {
System.out.print(board[i][j] + " ");
}
System.out.println("");
}
}
}