1. 程式人生 > 實用技巧 >被圍繞的區域

被圍繞的區域

被圍繞的區域

給定一個二維的矩陣,包含XO
找到所有被X圍繞的區域,並將這些區域裡所有的OX填充。
被圍繞的區間不會存在於邊界上,換句話說,任何邊界上的O都不會被填充為X。任何不在邊界上,或不與邊界上的O相連的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。如果兩個元素在水平或垂直方向相鄰,則稱它們是相連的。

題解

/**
 * @param {character[][]} board
 * @return {void} Do not return anything, modify board in-place instead.
 */
var solve = function(board) {
    var m = board.length;
    if(m === 0) return void 0;
    var n = board[0].length;
    var dfs = function(x, y){
        if(x<0 || y<0 || x>=m || y>=n || board[x][y] !== 'O') return void 0;
        board[x][y] = 'A';
        dfs(x + 1, y);
        dfs(x - 1, y);
        dfs(x, y + 1);
        dfs(x, y - 1);
    }

    for (let i = 0; i < m; i++) {
        dfs(i, 0);
        dfs(i, n - 1);
    }
    for (let i = 1; i < n - 1; i++) {
        dfs(0, i);
        dfs(m - 1, i);
    }
    for (let i = 0; i < m; i++) {
        for (let k = 0; k < n; k++) {
            if (board[i][k] == 'A') board[i][k] = 'O';
            else if (board[i][k] == 'O') board[i][k] = 'X';
        }
    }
    return void 0;
};

思路

注意到題目的解釋,任何邊界上的O都不會被填充為X,這句話的意思是,所有最終與邊界處相連的O都不會被填充為X,注意此處的相連指的是如果兩個元素在水平或垂直方向相鄰,則稱它們是相連的。根據解釋,我們將所有邊界上的O找到,然後進行深度遞迴,搜尋所有和這個O相連的O,然後將這個O替換成其他字元,此處替換成了A,然後將矩陣中所有現在存在的O替換成X,即被包圍的需要替換的O,然後將所有的A替換回O即可。首先獲取矩陣的行數為m列數為n,然後定義dfs函式進行遞迴深度遍歷,如果傳遞的下邊不合法或者值不為O就返回,否則就將該值定義為A,然後對四個方向進行深度搜索,同樣標記相連OA,接下來對於矩陣的四個邊界進行遞迴深度搜索,將所有與邊界O

相連的O標記為A,最後遍歷矩陣,將矩陣中所有現在存在的O替換成X,即被包圍的需要替換的O,然後將所有的A替換回O即可。

每日一題

https://github.com/WindrunnerMax/EveryDay

參考

https://leetcode-cn.com/problems/surrounded-regions/