题目链接
题目大意
- 先将若干个地毯铺在地面上,然后给你任一一个点,判断出这个点在覆盖地面最上面的那张地毯的编号
解题思路
- 由于这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上。
- 所以我们要判断给定的点在那个地毯上,我们只需要从编号最大的开始向编号小的地毯逐个枚举进行判断即可,只要一判断出在某个地毯上,就可以退出枚举,输出地毯编号(从1开始)
- 注意:在矩形地毯边界和四个顶点上的点也算被地毯覆盖。
解题代码
import java.io.*;
public class Main {
private static StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
private static PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
private static class Carpet {
int a;
int b;
int g;
int k;
public Carpet(int a, int b, int g, int k) {
this.a = a;
this.b = b;
this.g = g;
this.k = k;
}
public boolean isInternal(int x, int y) {
int rA = a + g;
int rB = b + k;
if (x >= a && x <= rA && y >= b && y <= rB) return true;
return false;
}
}
public static void main(String[] args) {
int n = readInt();
Carpet[] carpets = new Carpet[n];
for (int i=0; i<n; i++) {
carpets[i] = new Carpet(readInt(), readInt(), readInt(), readInt());
}
int x = readInt();
int y = readInt();
for (int i=n-1; i>=0; i--) {
if (carpets[i].isInternal(x, y)) {
out.print(i+1);
out.flush();
return;
}
}
out.println(-1);
out.flush();
}
private static int readInt() {
int in = Integer.MIN_VALUE;
try {
st.nextToken();
in = (int) st.nval;
} catch (IOException e) {
e.printStackTrace();
}
return in;
}
}