130. 被圍繞的區域
阿新 • • 發佈:2020-08-11
給定一個二維的矩陣,包含 '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'。如果兩個元素在水平或垂直方向相鄰,則稱它們是“相連”的。
class Solution { boolean[][] visited; // 建立一個節點,儲存x, y public class Pos{ int i; int j; Pos(int i, int j) { this.i = i; this.j = j; } } public void solve(char[][] board) { if(board.length == 0) return; int rows = board.length, cols = board[0].length; visited = new boolean[rows][cols]; // 左側一列 for(int i = 0; i < rows; i++) { if(board[i][0] == 'O' && visited[i][0] != true) { bfs(board, i, 0); } } // 上側一列 for(int i = 0; i < cols; i++) { if(board[0][i] == 'O' && visited[0][i] != true) { bfs(board, 0, i); } } // 右側一列 for(int i = 0; i < rows; i++) { if(board[i][cols - 1] == 'O' && visited[i][cols - 1] != true) { bfs(board, i, cols - 1); } } // 下側一列 for(int i = 0; i < cols; i++) { if(board[rows - 1][i] == 'O' && visited[rows - 1][i] != true) { bfs(board, rows - 1, i); } } for(int i = 0; i < rows; i++) { for(int j = 0; j < cols; j++) { if(!visited[i][j]) { board[i][j] = 'X'; } } } } public void bfs(char[][] board, int i, int j) { Queue<Pos> queue = new LinkedList<>(); queue.add(new Pos(i, j)); visited[i][j] = true; while(!queue.isEmpty()) { Pos current = queue.poll(); // 上 if (current.i - 1 >= 0 && board[current.i - 1][current.j] == 'O' && !visited[current.i - 1][current.j]) { queue.add(new Pos(current.i - 1, current.j)); visited[current.i - 1][current.j] = true; // 沒有continue. } // 下 if (current.i + 1 <= board.length - 1 && board[current.i + 1][current.j] == 'O' && !visited[current.i + 1][current.j]) { queue.add(new Pos(current.i + 1, current.j)); visited[current.i + 1][current.j] = true; } // 左 if (current.j - 1 >= 0 && board[current.i][current.j - 1] == 'O' && !visited[current.i][current.j - 1]) { queue.add(new Pos(current.i, current.j - 1)); visited[current.i][current.j - 1] = true; } // 右 if (current.j + 1 <= board[0].length - 1 && board[current.i][current.j + 1] == 'O' && !visited[current.i][current.j + 1]) { queue.add(new Pos(current.i, current.j + 1)); visited[current.i][current.j + 1] = true; } } } }
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/surrounded-regions
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。