leetcode1391

 1 class Solution:
 2     def dfs(self,grid,visited,x,y,m,n):
 3         if x < 0 or x >= m or y < 0 or y >= n or visited[x][y] == 1:
 4             return False
 5         if x == m - 1 and y == n - 1:
 6             return True
 7         visited[x][y] = 1
 8         if grid[x][y] == 1:
 9             r1,r2 = False,False
10             if y + 1 <= n - 1 and grid[x][y+1] != 2:#
11                 r1 = self.dfs(grid,visited,x,y+1,m,n)
12             if y - 1 >= 0 and grid[x][y-1] != 2:#
13                 r2 = self.dfs(grid,visited,x,y-1,m,n)
14             return r1 or r2
15         elif grid[x][y] == 2:
16             r1,r2 = False,False
17             if x + 1 <= m -1 and grid[x+1][y] != 1:#
18                 r1 = self.dfs(grid,visited,x+1,y,m,n)
19             if x - 1 >= 0 and grid[x-1][y] != 1:#
20                 r2 = self.dfs(grid,visited,x-1,y,m,n)
21             return r1 or r2
22         elif grid[x][y] == 3:
23             r1,r2 = False,False
24             if y - 1 >= 0:#
25                 r1 = self.dfs(grid,visited,x,y-1,m,n)
26             if x + 1 <= m - 1:#
27                 r2 = self.dfs(grid,visited,x+1,y,m,n)
28             return r1 or r2
29         elif grid[x][y] == 4:
30             r1,r2 = False,False
31             if y + 1 <= n - 1:#
32                 r1 = self.dfs(grid,visited,x,y+1,m,n)
33             if x + 1 <= m - 1:#
34                 r2 = self.dfs(grid,visited,x+1,y,m,n)
35             return r1 or r2
36         elif grid[x][y] == 5:
37             r1,r2 = False,False
38             if x - 1 >= 0:#
39                 r1 = self.dfs(grid,visited,x-1,y,m,n)
40             if y - 1 >= 0:#
41                 r2 = self.dfs(grid,visited,x,y-1,m,n)
42             return r1 or r2
43         else:#grid[x][y] == 6
44             r1,r2 = False,False
45             if x - 1 >= 0:#
46                 r1 = self.dfs(grid,visited,x-1,y,m,n)
47             if y + 1 <= n - 1:#
48                 r2 = self.dfs(grid,visited,x,y+1,m,n)
49             return r1 or r2
50 
51     def hasValidPath(self, grid: 'List[List[int]]') -> bool:
52         m = len(grid)
53         n = len(grid[0])
54         visited = [[0 for _ in range(n)]for _ in range(m)]
55         return self.dfs(grid,visited,0,0,m,n)

算法思路:dfs。

这种题思路不难,但是代码量很多,而且代码很相似,如果不够仔细,很容易出错。

本题的思路是使用深度优先遍历,因为只有一条路径,因此如果能够遍历到[m-1][n-1]的位置,则表示成功。

有三种条件,则表示失败:

1.出界:不能访问超出上下左右四个边界之外的位置。

2.路径有环:访问到重复的位置。

3.无法连接的路径:这里主要是要判断地形1与地形2是无法连接的。

原文地址:https://www.cnblogs.com/asenyang/p/12545399.html