原题链接
链接: 官网链接
解题思路
- 整一个全局数组area,里面存放该位置处的最顶层的窗口编号;
- 整一个结构体数组window,结构体Window里存放每一个窗口的x1, y1, x2, y2;读入时遍历这一块area,将其设为窗口的编号;
- 对于每次鼠标点击的坐标(x,y),area[x][y]就是该位置最顶层的窗口编号了,直接输出area[x][y]即可,记得再遍历该窗口范围内的area,将其设为该窗口编号,就是进行一次覆盖的过程;
C/C++代码
#include<iostream>
using namespace std;
const int maxn = 2700;
int n,m;
int area[maxn][maxn];
struct Window{
int x1;
int y1;
int x2;
int y2;
}window[12];
int main(){
fill(area[0], area[0]+maxn*maxn, 0);
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++){
//将编号为i(1~n)的窗口范围存起来
scanf("%d%d%d%d",&window[i].x1,&window[i].y1,&window[i].x2,&window[i].y2);
//将该窗口范围的area值设为窗口编号
for(int x=window[i].x1; x<=window[i].x2; x++){
for(int y=window[i].y1; y<=window[i].y2; y++){
area[x][y] = i;
}
}
}
int x,y,id;
while(m--){
scanf("%d%d",&x,&y);
id = area[x][y];
//area[x][y]即为答案
if(id == 0){
printf("IGNORED\n");
}
else{
printf("%d\n",id);
//记得要用该窗口重新覆盖一遍,即设为顶层窗口的过程
for(int x=window[id].x1; x<=window[id].x2; x++){
for(int y=window[id].y1; y<=window[id].y2; y++){
area[x][y] = id;
}
}
}
}
return 0;
}