这是一个较难的题目。题意分析:输入n个窗口m个鼠标落下的坐标,若鼠标落在了几个窗口上,那么优先输出位于上方的窗口,重叠是指几个窗口彼此压在一起,这样的话先输入的窗口反而会在最下面,输出了在上方的窗口后,要将该窗口移到最上层来。
思路分析:由于坐标杂,因此用结构体类型数据分别保存鼠标击点以及窗口的信息,关键要建立先键入的窗口反而在下面的这种映射关系。于是用一个int型数组将先输入的反而设置到最大的序号。将点到的窗口移到最上层也是只需调整这个序号数组即可。
#include <iostream>
using namespace std;
const int N=11;
struct{
int num;
int x1,y1,x2,y2;
}win[N];
struct{
int x,y;
}pointer[N];
int oder[N]={0};
int main(){
int n,m;
cin>>n>>m;
int i,j,k;
for(i=1;i<=n;i++){
cin>>win[i].x1>>win[i].y1>>win[i].x2>>win[i].y2;
win[i].num=i;
}
for(i=1;i<=n;i++){
oder[i]=n+1-i;
}
for(i=1;i<=m;i++){
cin>>pointer[i].x>>pointer[i].y;
}
int temp,winno;
for(i=1;i<=m;i++){
winno=-1;
for(j=1;j<=n;j++){
if(win[oder[j]].x1<=pointer[i].x && win[oder[j]].x2>=pointer[i].x
&&win[oder[j]].y1<=pointer[i].y && win[oder[j]].y2>=pointer[i].y){
winno=win[oder[j]].num;
temp=oder[j];
for(k=j;k>1;k--){
oder[k]=oder[k-1];
}
oder[1]=temp;
break;
}
}
if(winno==-1){
cout<<"IGNORED"<<endl;
}else{
cout<<winno<<endl;
}
}
return 0;
}