题目链接
从源点1跳到目标点target,给定秒数t秒,每次跳跃消耗1s
每次跳会从可以到达的若干点随机跳到一个节点
可以到达被定义为未跳过的节点,因为是树结构,所以不会有回路,因此未跳过的节点只可能是来的方向的节点
若跳到叶子节点,并且时间未用尽,则剩余时间不需要再跳
若未到达叶子节点,并且时间未用尽,则剩余时间必须继续跳跃
深搜即可,剪枝包含找到答案、时间超限
注意题目要求的时间未用尽但找到终点的两种情况
Runtime: 8 ms (beats 97.96%)
Memory Usage: 4.7 MB
func frogPosition(n int, edges [][]int, t int, target int) (result float64) {
found := false
var dfs func(curr int, prob int, depth int, nowProp float64, last int)
dfs = func(curr int, prob int, depth int, nowProp float64, last int) {
if found {
return
}
if depth > t {
return
}
nowProp /= float64(prob) // 权重计算
if curr == target {
result = nowProp
if depth < t { // 到达了目的地后 如果发现还有没跳的步数 且没有到达一个叶子节点则失败
for _, v := range edges {
if v[0] == curr {
if v[1] != last {
result = 0
break
}
} else if v[1] == curr {
if v[0] != last {
result = 0
break
}
}
}
}
found = true
return
}
count := 0
for _, v := range edges { // 统计下能跳到哪些节点,不能是来的方向的节点
if v[0] == last ||
v[1] == last {
continue
}
if v[0] == curr ||
v[1] == curr {
count++
}
}
for _, v := range edges { // jump now !
if v[0] == last ||
v[1] == last {
continue
}
if v[0] == curr {
dfs(v[1], count, depth + 1, nowProp, curr)
} else if v[1] == curr {
dfs(v[0], count, depth + 1, nowProp, curr)
}
}
}
dfs(1, 1, 0, 1, -1)
return
}