如何用java解决小明最近迷上了一款名为《扫雷》的游戏。 其中有一个关卡的任务如下: 在一个二维平面上放置着 n 个炸雷,第 i 个炸雷 (xi,yi,ri) 表示在坐标 (xi,yi) 处存在一个炸雷,它的爆炸范围是以半径为 ri 的一个圆。 为了顺利通过这片土地,需要玩家进行排雷。 玩家可以发射 m 个排雷火箭,小明已经规划好了每个排雷火箭的发射方向,第 j 个排雷火箭 (xj,yj,rj) 表示这个排雷火箭将会在 (xj,yj) 处爆炸,它的爆炸范围是以半径为 rj 的一个圆,在其爆炸范围内的炸雷会被引爆。 同时,当炸雷被引爆时,在其爆炸范围内的炸雷也会被引爆。 现在小明想知道他这次共引爆了几颗炸雷? 你可以把炸雷和排雷火箭都视为平面上的一个点。 一个点处可以存在多个炸雷和排雷火箭。 当炸雷位于爆炸范围的边界上时也会被引爆。 输入格式 输入的第一行包含两个整数 n、m。 接下来的 n 行,每行三个整数 xi,yi,ri,表示一个炸雷的信息。 再接下来的 m 行,每行三个整数 xj,yj,rj,表示一个排雷火箭的信息。 输出格式 输出一个整数表示答案。 数据范围 对于 40% 的评测用例:0≤x,y≤109,0≤n,m≤103,1≤r≤10, 对于 100% 的评测用例:0≤x,y≤109,0≤n,m≤5×104,1≤r≤10。 输入样例: 2 1 2 2 4 4 4 2 0 0 5 输出样例: 2
时间: 2023-02-05 12:16:16 浏览: 152
可以使用较为简单的暴力做法来解决这个问题。
首先,可以使用一个二维数组来表示地图上的点是否已经被引爆,初始化为 false。然后遍历所有的排雷火箭,对于每个火箭,遍历所有的炸雷,如果炸雷和火箭在爆炸范围内,则将炸雷设为 true。最后遍历所有的炸雷,统计被引爆的炸雷数量即可。
这种做法的时间复杂度为 O(nm),可以通过本题。
下面是 Java 代码的实现:
```java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
boolean[][] mines = new boolean[n][2];
for (int i = 0; i < n; i++) {
mines[i][0] = sc.nextInt();
mines[i][1] = sc.nextInt();
}
boolean[][] rockets = new boolean[m][2];
for (int i = 0; i < m; i++) {
rockets[i][0] = sc.nextInt();
rockets[i][1] = sc.nextInt();
}
int cnt = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
int dx = rockets[i][0] - mines[j][0];
int dy = rockets[i][1] - mines[j][1];
if (dx * dx + dy * dy <= ri * ri) {
mines[j][2] = true;
}
}
}
for (int i = 0; i < n; i++) {
if (mines[i][2]) {
cnt++;
}
}
System.out.println(cnt);
}
}
```
阅读全文