lanqiao 2110 (扫雷)

This commit is contained in:
2025-04-02 16:11:09 +08:00
parent fa9e05d8f2
commit dbdd987305

63
13lanqiao/test8.cpp Normal file
View File

@@ -0,0 +1,63 @@
// lanqiao 2110 (扫雷)
#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
struct circle{ int x, y, r; };
// 解法: 图的搜索处理图的连通性
// 检查圆c是否覆盖点p
bool check(circle c, pii p){
int t1 = (c.x - p.first)*(c.x - p.first);
int t2 = (c.y - p.second)*(c.y - p.second);
return c.r >= sqrt(t1 + t2);
}
int main(){
int n, m;
cin >> n >> m;
// key: 代表坐标 x, y value: 代表最大半径和对应数量
map<pii, pii> mp;
// 处理炸弹
for(int i = 1; i <= n; i++){
int x, y, r; cin >> x >> y >> r;
// 优化
pii p = {x, y};
mp[p].second++; // 统计同一个x, y点炸弹的数量
mp[p].first = max(mp[p].first, r); // 统计同一个x, y点炸弹的最大半径
}
// 处理火箭弹
queue<circle> q;
for(int i = 1; i <= m; i++){
int x, y, r; cin >> x >> y >> r;
q.push({x, y, r});
}
// 记录爆炸坐标
set<pii> s;
// 记录答案,即爆炸数量
int ans = 0;
while(!q.empty()){
circle cur = q.front(); q.pop();
int x = cur.x, y = cur.y, r = cur.r;
// 以i,j为中心长度均为2r的正方形范围这里为了方便直接枚举正方形后续通过判定排除无效点
for(int i = x - r; i <= x + r; i++){
for(int j = y - r; j <= y + r; j++){
pii p = {i, j};
// 已爆炸,不做处理
if(s.count(p)) continue;
// 该坐标无雷,不处理
if(!mp.count(p)) continue;
// 不在范围
if(!check(cur, p)) continue;
s.insert(p);
ans += mp[p].second;
q.push({i, j, mp[p].first});
}
}
}
cout << ans << endl;
return 0;
}
/* test samples -> 2
2 1
2 2 4
4 4 2
0 0 5
*/