201403-2窗口

#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,则表示没有满足要求的窗口。

上一篇:201403-2


下一篇:201403-1 相反数 (哈希表)