显然,我们只需要枚举爆炸的起点,然后找到引爆的炸弹依次爆炸,很容易想到这是一个DFS的过程或者BFS的过程,可以建图直接用BFS搜索,也可以用DFS搜索。
using LL = long long;
class Solution {
public:
int maximumDetonation(vector<vector<int>>& bombs) {
int n = bombs.size();
// 判断炸弹 u 能否引爆炸弹 v
auto isConnected = [&](int u, int v) -> bool {
LL dx = bombs[u][0] - bombs[v][0];
LL dy = bombs[u][1] - bombs[v][1];
LL r = bombs[u][2];
return r * r >= dx * dx + dy * dy;
};
// 维护引爆关系有向图
vector<vector<int>> edges(n);
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (i != j && isConnected(i, j)) {
edges[i].push_back(j);
}
}
}
int res = 0; // 最多引爆数量
for(int i = 0; i < n; i++) {
queue<int> q;
q.push(i);
vector<bool> visited(n);
visited[i] = true;
int cnt = 1;
while (!q.empty()) {
auto v = q.front(); q.pop();
for (auto idx : edges[v]) {
if (!visited[idx]) {
q.push(idx);
visited[idx] = true;
cnt++;
}
}
}
res = max(res, cnt);
}
return res;
}
};