- 题目大意
- 解题思路
- 具体代码
- 1.准备工作
- 2.遍历标记
- 3.处理最终答案
题目大意
解题思路
要求判断是否轰炸,以及轰炸的次数和最后一次轰炸是第几轮,本题采用数组来做,所以肯定有一个int数组来记录轰炸的次数,设为times,一个int数组来记录最后一次轰炸是第几轮,设为ends。
模拟就是问什么设什么,然后按照题目进行处理即可。
其实两个数组可以得到最终答案,就是遍历前面的time数组,就可以得到Y或N的结果,但是为了最后的美观我又增加了一个String数组keys来汇总最后的答案。
具体代码 1.准备工作我属于有点强迫症的,所以一般变量的设定都是放在一块。
代码如下(示例):
import java.util.Scanner;
public class Main {
static int n,m,x,y;
static int[][]times;
static int[][]ends;
static String[] keys;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
x = sc.nextInt();
y = sc.nextInt();
times = new int[n+1][m+1];
ends = new int[n+1][m+1];
keys = new String[y+1];
2.遍历标记
每次的轰炸区域是x1到x2,y1到y2的一个矩形,一共有x次。首先,标记轰炸矩形需要进行两重for循环,将区域内所有的点在times上记录,int数组创建时,默认初始值为0,所以进行times[a][b]++操作计数即可得到轰炸次数。
而ends数组采用覆盖标记,共进行x次轰炸,每次的序号就是i+1,直接在对应的轰炸区域进行标记即可。
以上操作共有x次,所以在外层再套用一层for循环,省去了输入再读取的操作。
代码如下(示例):
for(int i = 0;i < x;i++){
int x1 = sc.nextInt();
int y1 = sc.nextInt();
int x2 = sc.nextInt();
int y2 = sc.nextInt();
for(int a = x1;a <= x2;a++){
for(int b = y1;b <= y2;b++){
times[a][b]++;
ends[a][b] = i+1;
}
}
}
3.处理最终答案
由于最终要判断是否被轰炸,并且输出Y和N,应当采用字符类型的数组来进行汇总最后答案,不过此处要注意,建议使用String类型,若是使用char类数组将出现int类型转换的问题。
最后有y个关键点要进行判断,故进行y次输入,在times和ends中关键点找到对应的答案,并按照题目顺序进行拼接(toString方法),记录到keys数组中,最后进行输出即可。
代码如下(示例):
for(int i = 0;i < y;i++){
int xx = sc.nextInt();
int yy = sc.nextInt();
if(times[xx][yy] != 0){
int a = times[xx][yy];
int b = ends[xx][yy];
keys[i] = "Y"+" "+a+" "+b;
}
else keys[i] = "N";
}
for(int i = 0;i < y;i++){
System.out.println(keys[i]);
}
以上,应该还有更简洁的方法。



