北航 机试 窗口点击事件

【题意】
在计算机屏幕上,有 N 个窗口。窗口的边界上的点也属于该窗口。窗口之间有层次的区别,
在多于一个窗口重叠的区域里,只会显示位于顶层的窗口里的内容。当你用鼠标点击某个点
的时候,若其在窗口内,你就选择了处于被点击位置所属的最顶层窗口,并且这个窗口就会
被移到所有窗口的顶层,而剩余的窗口的层次顺序不变,如果你点击的位置不属于任何窗口
计算机就会忽略你这次点击。编写一个程序模拟点击窗口的过程:先从标准输入读入窗口的
个数,窗口编号和位置(以窗口的左上角和右下角的坐标表示,先输入的窗口层次高),然后
2读入点击的次数和位置(以点击的坐标表示),编写程序求得经过上述点击后的窗口叠放次序。
【假设】:
1、屏幕左下角作为 X 轴和 Y 轴坐标原点,即坐标为(0,0),所有输入的坐标
数值都是整数,并且都大于等于 0,小于等于 1000。
2、输出窗口的叠放次序时从最后点击后最顶层的窗口编号开始按层次依次输出;
3、输入的窗口个数大于 0 并且小于等于 10,点击次数大于 0 并且小于等于 20。
【输入】
第一行窗口个数 n,接下来 n 行每行一个窗口的编号、左下角坐标、右上角坐标。
接下来一行点击次数 k,接下来 k 行每行一个点击坐标。
【输出】
一行 n 个数字,表示 K 次点击后按层次排列的窗口编号,空格隔开。
行末空格与文末换行可有可无。
【样例】
标准输入
4
1 43 31 70 56
2 50 24 80 50
3 23 13 63 42
4 57 36 90 52
5
47 28
73 40
68 32
82 43
27 49
标准输出
4 2 3 1

代码:
#include <iostream>
using namespace std;

typedef struct{
    int id;
    int ur[2]; // right up
    int bl[2]; // left bottom
}Page;

int main() {

    int n,m;
    cin>>n;
    //Page *p = new Page[n];
    Page p[10];
    for(int i=0;i<n;i++){
        cin>>p[i].id>>p[i].bl[0]>>p[i].bl[1]>>p[i].ur[0]>>p[i].ur[1];
    }
    cin>>m;
    for(int i=0;i<m;i++){
        int x,y;
        cin>>x>>y;
        int index = -1;
        for(int j=n-1;j>=0;j--){
            if( x>=p[j].bl[0] && x<=p[j].ur[0] && y>=p[j].bl[1] && y<=p[j].ur[1] ){
                // involv in the page
                  index = j;
                break;
            }
        }

        if(index == -1){
            // not involve in any page
            continue;
        }

        //tansit
        Page mid = p[index];
        for(int j=index;j<n-1;j++){
            p[j] = p[j+1];
        }
        p[n-1] = mid;
    }
    for(int i=n-1;i>-1;i--){
        cout<<p[i].id<<" ";
    }
    return 0;
}
/*
 4
 1 43 31 70 56
 2 50 24 80 50
 3 23 13 63 42
 4 57 36 90 52
 5
 47 28
 73 40
 68 32
 82 43
 27 49
 */
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值