給定一個二維的矩陣,包含?'X'?和?'O'(字母 O)。
找到所有被 'X' 圍繞的區域,并將這些區域里所有的?'O' 用 'X' 填充。
示例:
X X X X
X O O X
X X O X
X O X X
運行你的函數后,矩陣變為:
X X X X
X X X X
X X X X
X O X X
解釋:
被圍繞的區間不會存在于邊界上,換句話說,任何邊界上的?'O'?都不會被填充為?'X'。 任何不在邊界上,或不與邊界上的?'O'?相連的?'O'?最終都會被填充為?'X'。如果兩個元素在水平或垂直方向相鄰,則稱它們是“相連”的。
思路:我們發現,沒有被“圍繞”的‘o’就是和邊界連接的。比如如下情況:
X X O X
X O O X
X X O X
X O O?X
'O'不會被改變,因為和邊界的‘O’連接,沒有被‘X’圍繞。
所以,我們從邊界開始dfs,把遇到的“O”變為“#”代表和邊界相連。
然后遍歷數組,把''O'變為X(因為不和邊界相連),把#變為X(因為和邊界相連)。
class Solution {public void solve(char[][] board) {if (board == null || board.length == 0) return;int m = board.length;int n = board[0].length;for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {// 從邊緣開始搜索if ((i == 0 || j == 0 || i == m - 1 || j == n - 1) && board[i][j] == 'O') {dfs(board, i, j);}}}for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {//沒有被搜索到過,不和邊界連接if (board[i][j] == 'O') {board[i][j] = 'X';}//被改變過,和邊界連接if (board[i][j] == '#') {board[i][j] = 'O';}}}}public void dfs(char[][] board, int i, int j) {if (i < 0 || j < 0 || i >= board.length || j >= board[0].length || board[i][j] == 'X' || board[i][j] == '#') {// board[i][j] == '#' 說明已經搜索過了. return;}board[i][j] = '#';dfs(board, i - 1, j); // 上dfs(board, i + 1, j); // 下dfs(board, i, j - 1); // 左dfs(board, i, j + 1); // 右}
}
?