[解题报告]Frog Position After T Seconds

这篇博客分享了解决Frog Position After T Seconds问题的思路。通过深度优先搜索(DFS),在给定时间限制t秒内,从节点1出发随机跳转到树结构中的节点。当到达叶子节点且时间未用尽时,有两种结束情况:时间用尽或找到目标节点。该方法在限制内存使用和运行时间上表现出色。
摘要由CSDN通过智能技术生成

题目链接
从源点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
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值