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是无法连接的。