lc1036-逃离大迷宫

题目描述

  • 原题
  • 在一个 10^6 x 10^6 的网格中有一些阻挡块,和两个点
  • 问这两个点是否连通

示例

输入:blocked = [[0,1],[1,0]], source = [0,0], target = [0,2]
输出:false
输入:blocked = [], source = [0,0], target = [999999,999999]
输出:true

题解

  • 思路:bfs
    • bfs 容易想到,主要是最大封锁区域。借助边界,最大封锁区域是三角形,面积是 m * (m - 1) / 2,m 是封锁块的数量
    • golang 不能像 cpp 那样把哈希表定义成成员变量,若定义成全局变量,你就调吧,大概率是评测器不会把全局变量清空
var (
    dx = [4]int{-1, 0, 1, 0}
    dy = [4]int{0, 1, 0, -1}
    m int
)

const (
    n int = 1e6
    MaxQueueSize = 20010
)

func isEscapePossible(blocked [][]int, source []int, target []int) bool {
    m = len(blocked)

    mp := make(map[string]bool)
    for _, v := range blocked { mp[get(v)] = true }
    return bfs(source, target, mp) && bfs(target, source, mp)
}

func get(p []int) string {
    return strconv.Itoa(p[0]) + " " + strconv.Itoa(p[1])
}

func bfs(start, end []int, mp map[string]bool) bool {
    q := make([][]int, MaxQueueSize)
    hh, tt := 0, -1

    tt ++
    q[tt] = start

    visited := make(map[string]bool)
    visited[get(start)] = true

    cnt := 1

    for hh <= tt {
        t := q[hh]
        hh++

        for d := 0; d < 4; d++ {
            x, y := t[0] + dx[d], t[1] + dy[d]
            key := get([]int{x, y})

            if 0 <= x && x < n && 0 <= y && y < n && !mp[key] && !visited[key] {
                cnt ++
                if cnt * 2 > m * (m - 1) { return true }
                if x == end[0] && y == end[1] { return true }
                visited[key] = true

                tt ++
                q[tt] = []int{x, y}
            }
        }
    }
    return false
}
posted @ 2025-09-25 23:53  余越  阅读(8)  评论(0)    收藏  举报