力扣杯2021秋季编程大赛第四题 LCP 42. 玩具套圈

这篇博客介绍了一个编程问题——LCP42.玩具套圈,主要思路是通过枚举圆环和玩具的位置来判断是否能套中。代码中,首先创建一个集合存储所有圆环坐标,然后遍历每个玩具,对每个玩具进行x和y方向的枚举,检查是否存在套中的情况。最后返回可以被套中的玩具数量。这是一个涉及几何和枚举算法的编程挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题链接:LCP 42. 玩具套圈

思路

记toy的坐标xt, yt, 半径t
ring的坐标xr, yr
满足条件的toy (xt - xr)^2 + (yt - yr)^2 <= (t - r)^2 && r >= t —(1)
由于r <= 10
对于每个toy来说 (1)式的范围较小 可以枚举xryr 若存在圆环 则该玩具可以被套中

代码

class Solution {
public:
    int circleGame(vector<vector<int>>& toys, vector<vector<int>>& ci, int r) {
        set<pair<int, int>> se; //记录所有圆环
        
        for (auto i : ci) {
            se.insert({i[0], i[1]});
        }
        
        int ans = 0;
        
        int dir[4][2] = {{1, -1}, {1, 1}, {-1, 1}, {-1, -1}}; //方向
        
        for (auto toy : toys) {
            int xt = toy[0], yt = toy[1], t = toy[2];
            
            if (t > r)
                continue;
            
            int sr = (t - r) * (t - r);
            
            bool f = false;
            for (int dx = 0; dx * dx <= sr && !f; dx ++ ) //枚举x方向距离
                for (int dy = 0; dx * dx + dy * dy <= sr && !f; dy ++ ) { //枚举y方向距离
                    for (int i = 0; i < 4 && !f; i ++ ) {
                        int xr = xt + dx * dir[i][0], yr = yt + dy * dir[i][1];
                        if (se.count({xr, yr})) {
                            ans ++ ;
                            f = true;
                        }
                    }
                }
        }
        
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值