#include <iostream> using namespace std; const int N=10; struct{ int winno; int x_1,y_1,x_2,y_2; } win[N]; struct{ int x,y; }point[N]; int order[N]; int main(){ int n,m; cin>>n>>m; for(int i=0;i<n;++i){ win[i].winno = i+1; cin>>win[i].x_1>>win[i].y_1>>win[i].x_2>>win[i].y_2; } for(int i=0;i<m;i++){ cin>>point[i].x>>point[i].y; } //初始窗口显示顺序 for(int i=0;i<n;++i) order[i] = n-i-1;//优先级依次为从最后面的窗口到前面的窗口 //模拟鼠标点击 int winno,temp; for(int i=0;i<m;++i){ winno = -1; for(int j=0;j<n;j++){ //该题的突破点是从排在前面的窗口依次向后面检测 //如果找到一个优先级别高的,且满足要求的,则可以直接进行操作,后面的直接break if(win[order[j]].x_1<= point[i].x && point[i].x<=win[order[j]].x_2 && win[order[j]].y_1<= point[i].y && point[i].y<=win[order[j]].y_2) { winno = win[order[j]].winno; //将被点击的窗口移到最前面 temp = order[j]; //所以排在它前面的窗口都需要往后串一个格子 for(int k=j;k>0;k--){ order[k] = order[k-1]; } order[0] = temp; break; } } //输出结果 if(winno == -1) cout<<"IGNORED" <<endl; else cout<<winno<<endl; } return 0; }
注意:
1.需要维护一个数组来记录当前的优先顺序,从数组低位到数组的高位,优先级别依次降低。
2.遍历的时候则从维护的优先数组,从前向后遍历,如果遍历到相应的符合条件的结果,直接break即可,如果仍未-1,则表示没有满足要求的窗口。