思路:对每个窗口,要同时设置一个编号id,和一个表示次序的num。编号是不变的,是为了最终输出;次序是要每次更新的,每次被点击的窗口(通过set排序选num最大的为被点击的)要到最上面,被点击窗口原来上面的那些窗口则要下降一级。由于可能同时点击了多个窗口,所以要对这些窗口的上下次序排序,选择最上面的窗口。
#include <iostream>
#include <algorithm>
#include <set>
struct point{
int x1,y1,x2,y2;
int id,num;
};
bool click(point p,int x,int y)
{
if(p.x1<=x&&p.x2>=x&&p.y1<=y&&p.y2>=y)
return true;
else
return false;
}
using namespace std;
int main()
{
int n,m,x,y;
cin >> n >> m;
point a[n];
for(int i=0;i<n;i++)
{
cin >> a[i].x1 >> a[i].y1 >> a[i].x2 >> a[i].y2;
a[i].id=a[i].num=i+1;
}
for(int i=0;i<m;i++)
{
set<int> s;
cin >> x >> y;
for(int j=0;j<n;j++)//检测被点击到的窗口编号
{
if(click(a[j],x,y))
{
s.insert(a[j].num);//排序找到被点击的中最上层的窗口
}
}
if(s.empty()) cout << "IGNORED" << endl;//没点击窗口
else
{
for(int k=0;k<n;k++)
{
set<int>::iterator it=s.end();
it--;
if(a[k].num==*it)
{
cout << a[k].id << endl;//输出被点击窗口的编号
for(int j=0;j<n;j++)
{
if(a[j].num>a[k].num)
{
a[j].num--;//在它上面的窗口次序都降一级
}
}
a[k].num=n;//将其挪动到最上面(序号最大)
break;
}
}
}
}
return 0;
}
注意set没有s[s.size()-1]这种用法,取值必须用迭代器。但是s.size()是有的。
测试用例:
3 4
0 0 4 4
1 1 5 5
2 2 6 6
1 1
0 0
4 4
0 5