概述
1.对于这一道题我们的第一首选还是使用自己手写哈希表,但是我还是用的DFS(因为本人还没有学会,等后面学会会补上的)
2.DFS对于实现这一道题还是超出了时间,但是我们还是拿到60左右的分数,还是挺香的。
解题思路
1.这一题我们拆解成了使用DFS遍历每一个火箭与炸弹和被引爆炸弹与其他的炸弹比较
(如果没有了解过DFS,推荐看一下这一篇文章,我感觉写的还挺不错的,链接)
2.比较的内容:
(1) 是否之前被其他的火箭或者炸弹引爆
(2)是否在可被引爆的范围内
3.我们值得注意的点是需要需要注意不要有相同的值,这样我们们漏算掉几个数
下面就是代码,
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int W = 50010; // 扫雷和炸雷题中范围是0--10e4,定义的稍微大一点
struct node
{
int x, y, r, n;
// (x y)为存储位置, r半径, n对应的编号(第几个雷或者是火箭)
};
ll i, j, a, n, m, b, r, N = 0;
ll v[W] = { 0 };
node arr1[W], arr2[W]; // arr1 存储地雷 arr2 存储火箭
bool compare(node x, node y)
// 比较炸雷y是否在火箭x范围内或者比较炸雷y是否在炸雷x范围值内
{
int a = abs((x.x - y.x));
int b = abs((x.y - y.y));
return sqrt(a * a + b * b) <= x.r;
}
void dfs(node a)
{
for (int i = 0; i < n; i++) // 将当前火箭a与每个炸雷一次比较
{
if (v[arr1[i].n] == 0) // 若炸雷未用过,为0,v[n]根据炸雷编号判断
{
if (compare(a, arr1[i])) // 若在范围内返回 ture
{
v[arr1[i].n] = 1; // 将该编号标记为已经用过
N++;
dfs(arr1[i]); // 炸雷范围内的爆炸也能引起其他炸雷的爆炸, 递归
}
}
}
}
int main()
{
cin >> n >> m; // n炸雷数,m火箭数
for (int i = 0; i < n; i++)
{
scanf_s("%lld%lld%lld", &a, &b, &r);
// 炸雷位置,半径和编号
arr1[i].x = a;
arr1[i].y = b;
arr1[i].r = r;
arr1[i].n = i;
}
for (int i = 0; i < m; i++)
{
scanf_s("%lld%lld%lld", &a, &b, &r);
// 火箭位置,半径和编号
arr2[i].x = a;
arr2[i].y = b;
arr2[i].r = r;
arr2[i].n = i;
}
for (int i = 0; i < m; i++) // 将每个火箭以此发射
{
dfs(arr2[i]);
}
cout << N << endl; // 输出引爆的炸雷数量
return 0;
}