zoukankan      html  css  js  c++  java
  • [Swift]LeetCode1036.逃离大迷宫 | Escape a Large Maze

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/10783485.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    In a 1 million by 1 million grid, the coordinates of each grid square are (x, y) with 0 <= x, y < 10^6.

    We start at the source square and want to reach the target square.  Each move, we can walk to a 4-directionally adjacent square in the grid that isn't in the given list of blocked squares.

    Return true if and only if it is possible to reach the target square through a sequence of moves.

    Example 1:

    Input: blocked = [[0,1],[1,0]], source = [0,0], target = [0,2]
    Output: false
    Explanation: 
    The target square is inaccessible starting from the source square, because we can't walk outside the grid.
    

    Example 2:

    Input: blocked = [], source = [0,0], target = [999999,999999]
    Output: true
    Explanation: 
    Because there are no blocked cells, it's possible to reach the target square.

    Note:

    1. 0 <= blocked.length <= 200
    2. blocked[i].length == 2
    3. 0 <= blocked[i][j] < 10^6
    4. source.length == target.length == 2
    5. 0 <= source[i][j], target[i][j] < 10^6
    6. source != target

    在一个 10^6 x 10^6 的网格中,每个网格块的坐标为 (x, y),其中 0 <= x, y < 10^6

    我们从源方格 source 开始出发,意图赶往目标方格 target。每次移动,我们都可以走到网格中在四个方向上相邻的方格,只要该方格不在给出的封锁列表 blocked 上。

    只有在可以通过一系列的移动到达目标方格时才返回 true。否则,返回 false

    示例 1:

    输入:blocked = [[0,1],[1,0]], source = [0,0], target = [0,2]
    输出:false
    解释:
    从源方格无法到达目标方格,因为我们无法在网格中移动。
    

    示例 2:

    输入:blocked = [], source = [0,0], target = [999999,999999]
    输出:true
    解释:
    因为没有方格被封锁,所以一定可以到达目标方格。

    提示:

    1. 0 <= blocked.length <= 200
    2. blocked[i].length == 2
    3. 0 <= blocked[i][j] < 10^6
    4. source.length == target.length == 2
    5. 0 <= source[i][j], target[i][j] < 10^6
    6. source != target

    Runtime: 3096 ms
    Memory Usage: 24.7 MB
     1 class Solution {
     2     func isEscapePossible(_ blocked: [[Int]], _ source: [Int], _ target: [Int]) -> Bool {
     3         var set:Set<Int> = Set<Int>()
     4         for b in blocked
     5         {
     6             set.insert(b[0]<<32|b[1])
     7             if set.contains(source[0]<<32|source[1]) {return false}
     8             if set.contains(target[0]<<32|target[1]) {return false}
     9         }
    10         
    11         var ss:[[Bool]] = go(source[0], source[1], set)
    12         var ts:[[Bool]] = go(target[0], target[1], set)
    13         if abs(source[0] - target[0]) > 200 || abs(source[1] - target[1]) > 200
    14         {
    15             var pt:Int  = 0
    16             for i in 0..<411
    17             {
    18                 for j in 0..<411
    19                 {
    20                     if i == 0 || j == 0 || i == 410 || j == 410
    21                     {
    22                         if ss[i][j] {pt |= 1}
    23                         if ts[i][j] {pt |= 2}
    24                     }
    25                 }
    26             }
    27             return pt == 3
    28         }
    29         else
    30         {
    31             return ss[target[0]-source[0]+205][target[1]-source[1]+205]
    32         }
    33     }
    34     
    35     func go(_ sr:Int,_ sc:Int,_ obs:Set<Int>) -> [[Bool]]
    36     {
    37         var can:[[Bool]] = [[Bool]](repeating: [Bool](repeating: false, count: 411), count: 411)
    38         can[205][205] = true
    39         var q:[[Int]] = [[Int]]()
    40         q.append([205, 205])
    41         let dr:[Int] = [ 1, 0, -1, 0 ]
    42         let dc:[Int] = [ 0, 1, 0, -1 ]
    43         while(!q.isEmpty)
    44         {
    45             var cur:[Int] = q.removeLast()
    46             let r:Int = cur[0]
    47             let c:Int = cur[1]
    48             for k in 0..<4
    49             {
    50                 let nr:Int = r + dr[k]
    51                 let nc:Int = c + dc[k]
    52                 if nr >= 0 && nr < 411 && nc >= 0 && nc < 411 && !can[nr][nc]
    53                     && sr-205+nr >= 0 && sr-205+nr < 1000000
    54                     && sc-205+nc >= 0 && sc-205+nc < 1000000
    55                     && !obs.contains((sr-205+nr)<<32|(sc-205+nc))
    56                 {
    57                     can[nr][nc] = true
    58                     q.append([nr, nc])
    59                 }
    60             }
    61         }
    62         return can
    63     }
    64 }
  • 相关阅读:
    vue-打包为webapp,如何解决应用内跳转外部链接返回导致退出应用
    vue-引入mui.js报错如何处理
    微信小程序中-折线图
    Docker基础命令
    retry示例
    authenticate验证的流程
    django生产环境启动问题
    redis基本操作
    DBUtils数据库连接池
    外部程序调用Django模块的解决办法
  • 原文地址:https://www.cnblogs.com/strengthen/p/10783485.html
Copyright © 2011-2022 走看看