返回介绍

solution / 2500-2599 / 2556.Disconnect Path in a Binary Matrix by at Most One Flip / README_EN

发布于 2024-06-17 01:03:04 字数 6362 浏览 0 评论 0 收藏 0

2556. Disconnect Path in a Binary Matrix by at Most One Flip

中文文档

Description

You are given a 0-indexed m x n binary matrix grid. You can move from a cell (row, col) to any of the cells (row + 1, col) or (row, col + 1) that has the value 1. The matrix is disconnected if there is no path from (0, 0) to (m - 1, n - 1).

You can flip the value of at most one (possibly none) cell. You cannot flip the cells (0, 0) and (m - 1, n - 1).

Return true _if it is possible to make the matrix disconnect or _false_ otherwise_.

Note that flipping a cell changes its value from 0 to 1 or from 1 to 0.

 

Example 1:

Input: grid = [[1,1,1],[1,0,0],[1,1,1]]
Output: true
Explanation: We can change the cell shown in the diagram above. There is no path from (0, 0) to (2, 2) in the resulting grid.

Example 2:

Input: grid = [[1,1,1],[1,0,1],[1,1,1]]
Output: false
Explanation: It is not possible to change at most one cell such that there is not path from (0, 0) to (2, 2).

 

Constraints:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 1000
  • 1 <= m * n <= 105
  • grid[i][j] is either 0 or 1.
  • grid[0][0] == grid[m - 1][n - 1] == 1

Solutions

Solution 1: Two DFS Traversals

First, we perform a DFS traversal to determine whether there is a path from $(0, 0)$ to $(m - 1, n - 1)$, and we denote the result as $a$. During the DFS process, we set the value of the visited cells to $0$ to prevent revisiting.

Next, we set the values of $(0, 0)$ and $(m - 1, n - 1)$ to $1$, and perform another DFS traversal to determine whether there is a path from $(0, 0)$ to $(m - 1, n - 1)$, and we denote the result as $b$. During the DFS process, we set the value of the visited cells to $0$ to avoid revisiting.

Finally, if both $a$ and $b$ are true, we return false, otherwise, we return true.

The time complexity is $O(m \times n)$, and the space complexity is $O(m \times n)$. Where $m$ and $n$ are the number of rows and columns of the matrix, respectively.

class Solution:
  def isPossibleToCutPath(self, grid: List[List[int]]) -> bool:
    def dfs(i, j):
      if i >= m or j >= n or grid[i][j] == 0:
        return False
      grid[i][j] = 0
      if i == m - 1 and j == n - 1:
        return True
      return dfs(i + 1, j) or dfs(i, j + 1)

    m, n = len(grid), len(grid[0])
    a = dfs(0, 0)
    grid[0][0] = grid[-1][-1] = 1
    b = dfs(0, 0)
    return not (a and b)
class Solution {
  private int[][] grid;
  private int m;
  private int n;

  public boolean isPossibleToCutPath(int[][] grid) {
    this.grid = grid;
    m = grid.length;
    n = grid[0].length;
    boolean a = dfs(0, 0);
    grid[0][0] = 1;
    grid[m - 1][n - 1] = 1;
    boolean b = dfs(0, 0);
    return !(a && b);
  }

  private boolean dfs(int i, int j) {
    if (i >= m || j >= n || grid[i][j] == 0) {
      return false;
    }
    if (i == m - 1 && j == n - 1) {
      return true;
    }
    grid[i][j] = 0;
    return dfs(i + 1, j) || dfs(i, j + 1);
  }
}
class Solution {
public:
  bool isPossibleToCutPath(vector<vector<int>>& grid) {
    int m = grid.size(), n = grid[0].size();
    function<bool(int, int)> dfs = [&](int i, int j) -> bool {
      if (i >= m || j >= n || grid[i][j] == 0) {
        return false;
      }
      if (i == m - 1 && j == n - 1) {
        return true;
      }
      grid[i][j] = 0;
      return dfs(i + 1, j) || dfs(i, j + 1);
    };
    bool a = dfs(0, 0);
    grid[0][0] = grid[m - 1][n - 1] = 1;
    bool b = dfs(0, 0);
    return !(a && b);
  }
};
func isPossibleToCutPath(grid [][]int) bool {
  m, n := len(grid), len(grid[0])
  var dfs func(i, j int) bool
  dfs = func(i, j int) bool {
    if i >= m || j >= n || grid[i][j] == 0 {
      return false
    }
    if i == m-1 && j == n-1 {
      return true
    }
    grid[i][j] = 0
    return dfs(i+1, j) || dfs(i, j+1)
  }
  a := dfs(0, 0)
  grid[0][0], grid[m-1][n-1] = 1, 1
  b := dfs(0, 0)
  return !(a && b)
}
function isPossibleToCutPath(grid: number[][]): boolean {
  const m = grid.length;
  const n = grid[0].length;

  const dfs = (i: number, j: number): boolean => {
    if (i >= m || j >= n || grid[i][j] !== 1) {
      return false;
    }
    grid[i][j] = 0;
    if (i === m - 1 && j === n - 1) {
      return true;
    }
    return dfs(i + 1, j) || dfs(i, j + 1);
  };
  const a = dfs(0, 0);
  grid[0][0] = 1;
  grid[m - 1][n - 1] = 1;
  const b = dfs(0, 0);
  return !(a && b);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文