//计算位置x1,y1半径r1的玩具是否在x2,y2处半径位r2的圆圈内
func canGetToy(x1, y1, r1, x2, y2, r2 int) bool {
//两圆圆心连线距离
length := math.Sqrt(float64((x2-x1)*(x2-x1)) + float64((y1-y2)*(y1-y2)))
return length+float64(r1) <= float64(r2)
}
//套圈游戏
func circleGame(toys [][]int, circles [][]int, r int) int {
var toynum int
//减少循环次数
//所有圆圈的半径都是r
//[[4,3]]
//xi 小于圆右边
ciclemap := make(map[int][][]int)
for ci := 0; ci < len(circles); ci++ {
//玩具半径最小1
for i := circles[ci][0] - r + 1; i <= circles[ci][0]+r-1; i++ {
ciclemap[i] = append(ciclemap[i], circles[ci])
}
}
for i := 0; i < len(toys); i++ {
//玩具半径大于圈跳过
if toys[i][2] > r{
continue
}
//获取玩具可能对应的circle
toycircles:=ciclemap[toys[i][0]]
for j:=0;j<len(toycircles);j++{
if canGetToy(toys[i][0], toys[i][1], toys[i][2], toycircles[j][0], toycircles[j][1], r) {
toynum++
break
}
}
}
return toynum
}
每日一练--39玩具套圈
最新推荐文章于 2023-12-15 15:00:00 发布
该博客讨论了一个算法问题,即如何判断一个位于(x1, y1)并具有半径r1的玩具是否在另一个位于(x2, y2)且半径为r2的圆圈内。提供的代码实现了一个名为`canGetToy`的函数来计算两圆心之间的距离,并检查玩具是否在圆内。此外,还有一个`circleGame`函数用于处理套圈游戏,它遍历玩具和圆圈,利用`canGetToy`函数计算玩具被套中的数量。博客的重点在于优化循环和提高效率。
摘要由CSDN通过智能技术生成