按照样例画出样例图:
最先画的窗口置于下方,最后画的置于顶层。这里紫色窗口在顶层,绿色窗口在中间层,红色窗口在底层。我们依次称红色,绿色,紫色窗口为第一,二,三层窗口:
第一次点击的是(1,1)的位置,我们发现这个位置同时在第一个窗口和第二个窗口上,因为第二个窗口在上面,所以第二个窗口被选择,并将第二个窗口置于顶层。
第二次点击(0,0)这个点,这个位置只处于第一个窗口上,所以第一个窗口被选择,并且将第一个窗口置于顶层
第三次点击(4,4)这个点,这个位置处于第一个窗口和第二个窗口,在上一个查询中第一个窗口被选择置于顶层,所以此时优先选择第一个窗口。
第四次点击(0,5)这个点,这个位置不处于任一窗口上,输出IGNORED
code
#include<bits/stdc++.h>
using namespace std;
int n,m;
struct W
{
int x1,y1,x2,y2;
int id;
}windows[15];
int get(int x,int y)
{
//从上到下枚举每个窗口,因为优先选择处于上层的窗口
for(int i=n;i;i--)
{
if(x>=windows[i].x1&&y>=windows[i].y1&&x<=windows[i].x2&&y<=windows[i].y2)
return i; //返回窗口的id
}
return 0;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
int x1,y1,x2,y2;cin>>x1>>y1>>x2>>y2;
windows[i]={x1,y1,x2,y2,i};
}
while(m--)
{
int x,y;cin>>x>>y;
//判断一下点击的位置是否处于某个窗口上
int t=get(x,y);
//如果点击的位置不属于任一窗口输出IGNORED
if(!t)puts("IGNORED");
else
{
//否则输出窗口id
cout<<windows[t].id<<endl;
//然后把选中的窗口的窗口置于顶层
//首先保存一下该窗口,然后让后面的窗口往前挪,最后再把保存的窗口置于最后面即可
auto front=windows[t];
for(int i=t;i<n;i++)
{
windows[i]=windows[i+1];
}
windows[n]=front;
}
}
return 0;
}