被圍繞的區域
阿新 • • 發佈:2020-08-11
被圍繞的區域
給定一個二維的矩陣,包含X
和O
。
找到所有被X
圍繞的區域,並將這些區域裡所有的O
用X
填充。
被圍繞的區間不會存在於邊界上,換句話說,任何邊界上的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
,然後對四個方向進行深度搜索,同樣標記相連O
為A
,接下來對於矩陣的四個邊界進行遞迴深度搜索,將所有與邊界O
O
標記為A
,最後遍歷矩陣,將矩陣中所有現在存在的O
替換成X
,即被包圍的需要替換的O
,然後將所有的A
替換回O
即可。
每日一題
https://github.com/WindrunnerMax/EveryDay
參考
https://leetcode-cn.com/problems/surrounded-regions/