一开始想用链表做,因为看到把窗口移到最上层,而其他窗口次序不变,很容易想到删除指定位置元素再插入到结尾,但这方面不太熟悉,又因为如何遍历比较是否处于窗口区间内头疼,遍历比较明显用数组好,最后借鉴别人的想法。
思路是在结构体添加属性 层数,重载< ,按层数从小到大排序,进入循环,从w[0]开始比较,若不成功则层数+1 ,若成功则将其层数设为1 排序并break
遇到的错误 没有立flag 如果点击的地方没有窗口,应该把上一步加的层数全减回来,特殊情况要命 ,循环里若不满足条件 不必写sort w[i].ceng++写成了w[i].ceng+1 也不报错气人
1 43 31 70 56
2 50 24 80 50
3 23 13 63 42
4 57 36 90 52
#include<stdio.h>
#include<algorithm>
using namespace std;
struct win{
int id;
int lh;
int lz;
int rh;
int rz;
int ceng;
bool operator <(const win &A)const{
return ceng<A.ceng ;
}
}w[100];
int main(){
int n;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++){
scanf("%d%d%d%d%d",&w[i].id ,&w[i].lh ,&w[i].lz ,&w[i].rh ,&w[i].rz );
w[i].ceng =n-i;
}
sort(w,w+n);//没用
int m;
scanf("%d",&m);
int h,z;
for(int i=0;i<m;i++){
scanf("%d%d",&h,&z);
bool flag=false;
for(int i=0;i<n;i++){
if(w[i].lh<=h&&h<=w[i].rh&&w[i].lz<=z&&z<=w[i].rz){
w[i].ceng=1;
sort(w,w+n);
flag=true;//有事件发生
break;
}
else{
w[i].ceng++;
}
}
if (flag==false){//毫无响应
for(int i=0;i<n;i++){
w[i].ceng=w[i].ceng-1;
//printf("%d \n",w[i].ceng);
}
}
}
for(int i=0;i<n;i++){
if(i==n-1)
printf("%d\n",w[i].id);
else
printf("%d ",w[i].id);
}
}
return 0;
}