zoukankan      html  css  js  c++  java
  • 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是无法连接的。

  • 相关阅读:
    hdu 2822 Dogs (BFS+优先队列)
    hdu 2757 Ocean Currents(BFS+DFS)
    hdu2844 Coins(普通的多重背包 + 二进制优化)
    hdu1495 && pku3414
    hdu1054 Strategic Game(树形DP)
    FckEditor V2.6 fckconfig.js中文注释
    数字文本控件
    统计在线用户列表 for .net WebForm
    智能客户端
    模拟Confirm的Web自定义控件
  • 原文地址:https://www.cnblogs.com/asenyang/p/12545399.html
Copyright © 2011-2022 走看看