1. 程式人生 > 實用技巧 >leetcode刷題筆記一百三十題 被圍繞的區域

leetcode刷題筆記一百三十題 被圍繞的區域

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'
            }
        }
    }
}