第一次CCF计算机软件能力认证 B题-窗口 题型:模拟

89 阅读2分钟

3198. 窗口 - AcWing题库

按照样例画出样例图:

最先画的窗口置于下方,最后画的置于顶层。这里紫色窗口在顶层,绿色窗口在中间层,红色窗口在底层。我们依次称红色,绿色,紫色窗口为第一,二,三层窗口: image.png

第一次点击的是(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;
}