leetcode刷題筆記一百三十題 被圍繞的區域
阿新 • • 發佈:2020-08-16
leetcode刷題筆記一百三十題 被圍繞的區域
源地址:130. 被圍繞的區域
問題描述:
給定一個二維的矩陣,包含 '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'。如果兩個元素在水平或垂直方向相鄰,則稱它們是“相連”的。
//主要使用了DFS思想,基於https://leetcode-cn.com/problems/surrounded-regions/solution/bei-wei-rao-de-qu-yu-by-leetcode-solution/的題解分析 //即將被包圍的O的識別轉換為不用轉換的O位置,進一步說就是與邊界O相連的位置 //對於每一個邊界上的 O,我們以它為起點,標記所有與它直接或間接相連的字母 O; //如果該字母被標記過,則該字母為沒有被字母 X 包圍的字母 O,我們將其還原為字母 O; //如果該字母沒有被標記過,則該字母為被字母 X 包圍的字母 O,我們將其修改為字母 X object Solution { def solve(board: Array[Array[Char]]): Unit = { val m = board.length if (m == 0) return val n = board(0).length def dfs(board: Array[Array[Char]], x: Int, y: Int): Unit = { if (x < 0 || x >= m || y < 0 || y >= n || board(x)(y) != 'O') return board(x)(y) = 'A' dfs(board, x-1, y) dfs(board, x+1, y) dfs(board, x, y-1) dfs(board, x, y+1) } for(i <- 0 to m-1) { dfs(board, i, 0) dfs(board, i, n-1) } for(i <- 0 to n-1){ dfs(board, 0, i) dfs(board, m-1, i) } for (i <- 0 to m-1){ for (j <- 0 to n-1){ if (board(i)(j) == 'A') board(i)(j) = 'O' else if (board(i)(j) == 'O') board(i)(j) = 'X' } } } }