题目描述
- 原题
- 在一个 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
}