LC 6305. 二进制矩阵中翻转最多一次使路径不连通

https://leetcode.cn/problems/disconnect-path-in-a-binary-matrix-by-at-most-one-flip/

这题一开始一直没有搞清楚思路,始终在一种分析的思路上:如果相邻两行或者是两列满足某种条件的话,那么就可以通过修改某个点,让整个图不连通。

当然最开始也考虑过,如果有两条不想交的路径的话,那么就可以确保图肯定是联通的,不过之前好像没有这类型的题目。

如果按照“查找两条不相交的路径”的话,其实实现起来不难:第一次随便寻找一条路,第二次搜索的时候避开第一条路就好了。

搜索路径的时候最好使用动态规划 `dp[i][j]` 表示是否可以从i,j出发到达终点,然后我们可以通过dp来构建路径。第二次搜索的时候,直接修改graph将上一次搜索路径的点设置为0就行。

class Solution:
    def isPossibleToCutPath(self, grid: List[List[int]]) -> bool:
        n, m = len(grid), len(grid[0])

        def search():
            dp = [[0] * m for _ in range(n)]
            dp[-1][-1] = 1
            for i in reversed(range(n)):
                for j in reversed(range(m)):
                    if grid[i][j] == 0: continue
                    if (i + 1) < n and dp[i + 1][j] == 1:
                        dp[i][j] = 1
                    if (j + 1) < m and dp[i][j + 1] == 1:
                        dp[i][j] = 1

            if dp[0][0] == 0: return []
            path = [(0, 0)]
            while True:
                (i, j) = path[-1]
                if (i, j) == (n - 1, m - 1): break
                if (i + 1) < n and dp[i + 1][j] == 1:
                    path.append((i + 1, j))
                    continue
                if (j + 1) < m and dp[i][j + 1] == 1:
                    path.append((i, j + 1))
                    continue
            return path

        path = search()
        # print(path)
        if not path: return True
        for x, y in path[1:-1]:
            grid[x][y] = 0
        # print(grid)
        path = search()
        if not path: return True
        return False