【题意】
在计算机屏幕上,有 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
*/