採用dfs
:可以先遍歷幾條邊將與其相連的數據爲o的位置全部替換爲P
,之後正常遍歷二維數組,將O
轉爲x
,將p
轉爲O
package JDFS;
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/5/1 0001 19:04
* 找到所有被 'X' 圍繞的區域,並將這些區域裏所有的 'O' 用 'X' 填充。
*/
public class Problem130 {
int[] dx = {1,-1,0,0};
int[] dy= {0,0,1,-1};
public void solve(char[][] board) {
//遍歷上邊的0
//這裏可以只遍歷四條邊,但是好像影響不大
for(int i=0;i<board.length;i++){
for(int j=0;j<board[0].length;j++){
//在邊界上找到O
if((i==0||j==0||i==board.length-1||j==board[0].length-1)&&board[i][j]=='O'){
dfs(board,i,j);
}
}
}
//再次遍歷數組,此時已經去除邊界的影響把O值變爲X即可
for(int i=0;i<board.length;i++) {
for (int j = 0; j < board[0].length; j++) {
board[i][j] = ( board[i][j]=='K')?'O':'X';
}
}
}
/**
*
* @param board
* @param col 當前行
* @param row 當前列
*
* 從邊界出發,先把邊界上和O連通點找到,
* 把這些變成B,
* 然後遍歷整個board把o貶稱x,把b貶稱O
*/
public void dfs(char[][] board,int col,int row){
//將當前元素轉成'k
board[col][row]='K';
//上下左右查找,
for(int i=0;i<4;i++){
int x = col+dx[i];
int y = row+dy[i];
//上下左右查找,
if((x>=0)&&(y>=0)&&(x<board.length)&&(y<board[0].length)&&board[x][y]=='O'){
dfs(board,x,y);
}
}
}
}