Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

被围绕的区域-130 #6

Open
sl1673495 opened this issue May 1, 2020 · 0 comments
Open

被围绕的区域-130 #6

sl1673495 opened this issue May 1, 2020 · 0 comments
Labels
DFS 深度优先遍历 复习 * 1 复习了一遍的题目

Comments

@sl1673495
Copy link
Owner

sl1673495 commented May 1, 2020

社区看到的优解

其实这题本身是我想复杂了,我是一个个格子去遍历,然后再上下左右去扩展延伸。

但是其实只需要遍历四个边界上的节点,遇到 O 的边界点才开始蔓延遍历,并且把遍历到的节点都标记为 M(防止重复遍历)

最后再一次性遍历整个二维数组,遇到 W 标记的格子都转为 O(因为是从边界蔓延的,一定是不符合 X 的条件的)。

这样遍历所走的路就会少很多。

var solve = function (board) {
  if (board.length == 0) return null;

  for (var y = 0; y < board.length; y++) {
    for (var x = 0; x < board[0].length; x++) {
      if (board[y][x] == "O" && (y == 0 || y == board.length - 1 || x == 0 || x == board[0].length - 1)) {
        dfs(board, y, x);
      }
    }
  }

  for (var y = 0; y < board.length; y++) {
    for (var x = 0; x < board[0].length; x++) {
      if (board[y][x] == "W") {
        board[y][x] = "O";
      } else {
        board[y][x] = "X";
      }
    }
  }

  return board;
};

function dfs(board, y, x) {
  if (y < 0 || x < 0 || y >= board.length || x >= board[0].length || board[y][x] == "X" || board[y][x] == "W") {
    return;
  }
  board[y][x] = "W";
  dfs(board, y + 1, x);
  dfs(board, y - 1, x);
  dfs(board, y, x + 1);
  dfs(board, y, x - 1);
  return;
}
@sl1673495 sl1673495 added the DFS 深度优先遍历 label May 1, 2020
@sl1673495 sl1673495 added the 复习 * 1 复习了一遍的题目 label Jun 14, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
DFS 深度优先遍历 复习 * 1 复习了一遍的题目
Projects
None yet
Development

No branches or pull requests

1 participant