原文:130. 被围绕的区域(leetcode 解题) - 每天一个JavaScript小知识@Js中文网 · 码农进阶题库

原文地址:https://www.javascriptc.com/interview-tips/zh_cn/leetcode/leetcode-javascript-solution-0130/

题目:

难度: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"
    }
  }
};

扩展阅读: