题目:
难度:Middle
相关话题:深度优先搜索
、广度优先搜索
、并查集
给定一个二维的矩阵,包含 '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'
。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。
思路:
题目也给了提示,只需要对边上的O
进行dfs
遍历,找出所有和它相连的O
,改变为S
。
最后再将所有的O
改变为X
,将所有的S
改变为O
。
/**
* @来源: Javascript中文网 - 前端进阶资源教程 https://www.javascriptc.com/
* @介绍:一个致力于帮助开发者用代码改变世界为使命的平台,每天都可以在这里找到技术世界的头条内容
* @param {character[][]} board
* @return {void} Do not return anything, modify board in-place instead.
*/
var solve = function(board) {
if(board.length===0)return
let m=board.length,n=board[0].length
let moves=[[-1,0],[1,0],[0,-1],[0,1]]
function dfs([x,y]){
board[x][y]="S"
for(let [dx,dy] of moves){
let nx=x+dx,ny=y+dy
if(nx<0 || ny<0 || nx>=m || ny>=n)continue
if(board[nx][ny]!=="O")continue
dfs([nx,ny])
}
}
for(let i=0;i<m;i++){
if(board[i][0]==="O")dfs([i,0])
if(board[i][n-1]==="O")dfs([i,n-1])
}
for(let i=1;i<n-1;i++){
if(board[0][i]==="O")dfs([0,i])
if(board[m-1][i]==="O")dfs([m-1,i])
}
for(let i=0;i<m;i++){
for(let j=0;j<n;j++){
if(board[i][j]==="O")board[i][j]="X"
else if(board[i][j]==="S")board[i][j]="O"
}
}
};
扩展阅读: