给你一个 m x n 的矩阵 board ,由若干字符 'X''O' ,找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O''X' 填充。

示例 1:
image.png

  1. 输入:board = [["X","X","X","X"],["X","O","O","X"],["X","X","O","X"],["X","O","X","X"]]
  2. 输出:[["X","X","X","X"],["X","X","X","X"],["X","X","X","X"],["X","O","X","X"]]
  3. 解释:被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O' 都不会被填充为 'X' 任何不在边界上,或不与边界上的 'O' 相连的 'O' 最终都会被填充为 'X'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。

示例 2:

  1. 输入:board = [["X"]]
  2. 输出:[["X"]]

提示:

  • m == board.length
  • n == board[i].length
  • 1 <= m, n <= 200
  • board[i][j]'X''O'

    解法一:回溯

  1. function solve(board: string[][]): void {
  2. const xMap = [0, 0, 1, -1]
  3. const yMap = [1, -1, 0, 0]
  4. let m = board.length
  5. let n = board[0].length
  6. for(let i = 0; i < m; i++) {
  7. for (let j = 0; j < n; j++) {
  8. // 这里需要注意要从边界开始计算不需要转换的区域
  9. const isBoundary = i === 0 || i === m - 1 || j === 0 || j === n -1
  10. if (isBoundary && board[i][j] === "O") {
  11. recursion(i, j)
  12. }
  13. }
  14. }
  15. for(let i = 0; i < m; i++) {
  16. for (let j = 0; j < n; j++) {
  17. if (board[i][j] === "O") {
  18. board[i][j] = "X"
  19. } else if (board[i][j] === "#") {
  20. board[i][j] = "O"
  21. }
  22. }
  23. }
  24. function recursion(x: number, y :number) {
  25. if (x < 0 || x >= m || y < 0 || y >= n || board[x][y] !== "O" ) {
  26. return
  27. }
  28. board[x][y] = "#"
  29. for (let i = 0; i < 4; i++) {
  30. recursion(x + xMap[i], y + yMap[i])
  31. }
  32. }
  33. return
  34. };