北航2015_窗口点击

本文深入探讨了使用数组和自定义排序策略实现的窗口管理器算法。通过在结构体中添加层数属性,并利用重载操作符进行排序,实现了点击事件触发时窗口的正确响应和层级调整。文章详细记录了算法的实现过程,包括错误排查和特殊情况处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一开始想用链表做,因为看到把窗口移到最上层,而其他窗口次序不变,很容易想到删除指定位置元素再插入到结尾,但这方面不太熟悉,又因为如何遍历比较是否处于窗口区间内头疼,遍历比较明显用数组好,最后借鉴别人的想法。

思路是在结构体添加属性 层数,重载< ,按层数从小到大排序,进入循环,从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;
	
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值