CCF软件能力认证-第一次-窗口
1.题目
问题描述
在某图形操作系统中,有 N 个窗口,每个窗口都是一个两边与坐标轴分别平行的矩形区域。窗口的边界上的点也属于该窗口。窗口之间有层次的区别,在多于一个窗口重叠的区域里,只会显示位于顶层的窗口里的内容。
当你点击屏幕上一个点的时候,你就选择了处于被点击位置的最顶层窗口,并且这个窗口就会被移到所有窗口的最顶层,而剩余的窗口的层次顺序不变。如果你点击的位置不属于任何窗口,则系统会忽略你这次点击。
现在我们希望你写一个程序模拟点击窗口的过程。
输入格式
输入的第一行有两个正整数,即 N 和 M。(1 ≤ N ≤ 10,1 ≤ M ≤ 10)
接下来 N 行按照从最下层到最顶层的顺序给出 N 个窗口的位置。 每行包含四个非负整数 x1, y1, x2, y2,表示该窗口的一对顶点坐标分别为 (x1, y1) 和 (x2, y2)。保证 x1<x2 , y1<y2。
接下来 M 行每行包含两个非负整数 x, y,表示一次鼠标点击的坐标。
题目中涉及到的所有点和矩形的顶点的 x, y 坐标分别不超过 2559 和 1439。
输出格式
输出包括 M 行,每一行表示一次鼠标点击的结果。如果该次鼠标点击选择了一个窗口,则输出这个窗口的编号(窗口按照输入中的顺序从 1 编号到 N);如果没有,则输出"IGNORED"(不含双引号)。
样例输入
3 4
0 0 4 4
1 1 5 5
2 2 6 6
1 1
0 0
4 4
0 5
样例输出
2
1
1
IGNORED
样例说明
第一次点击的位置同时属于第 1 和第 2 个窗口,但是由于第 2 个窗口在上面,它被选择并且被置于顶层。
第二次点击的位置只属于第 1 个窗口,因此该次点击选择了此窗口并将其置于顶层。现在的三个窗口的层次关系与初始状态恰好相反了。
第三次点击的位置同时属于三个窗口的范围,但是由于现在第 1 个窗口处于顶层,它被选择。
最后点击的 (0, 5) 不属于任何窗口。
2.题解
2.1 数组顺序->层级关系
思路
这题我们很容易知道,只要操作点击的坐标位于某个窗口限制的坐标之内,那么我们就可以判定是选中了这个窗口;
难点是在窗口之间存在重叠关系,我们如何知道选中的是那个窗口? 选中之后该窗口层级提升到最高层,又如何更新该层级关系?
这里我们巧妙利用数组顺序存储了窗口之间的层级关系
据题意,刚开始时的输入顺序就是窗口的初始层级关系,越往后输入的层级越高.
所以在第一次操作点击的时候,我们选择点击最外层的窗口,也就是我们可以选择从外向内遍历(对于数组顺序来说,就是倒序遍历),如果存在符合项,即输出其编号
同时,我们将该数组元素转移到最外层层级(也就是数组pos[n-1]),具体做法就是使用erase将这个元素从数组中删除,然后再添加到末尾即可
由于这里我们移动了元素,必然需要单独保存原来的编号值,所以除了坐标外,我们还需要单独保存每个窗口的编号值
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int n, m;
cin >> n >> m;
vector<vector<int>> pos(n, vector<int>(5));
// 初始化位置数组
for(int i = 0; i < n; i++){
for(int j = 0; j < 4; j++){
cin >> pos[i][j];
}
pos[i][4] = i + 1; // 记录编号
}
// 进行点击操作
for(int i = 0; i < m; i++){
int x, y, idx;
cin >> x >> y;
for(idx = n - 1; idx >= 0; idx--){
int x1 = pos[idx][0], y1 = pos[idx][1], x2 = pos[idx][2], y2 = pos[idx][3];
if((x <= x2 && x >= x1) && (y <= y2 && y >= y1)){
cout << pos[idx][4] << endl;
vector<int> temp = pos[idx];
pos.erase(pos.begin() + idx); // 删除第 idx 个元素(这里不要想着需要-1,因为begin是从0开始的,所以当前下标对应的总个数本来就要+1,和这个-1抵消掉了)
pos.push_back(temp); // 将保存的元素添加到末尾
break;
}
}
if(idx < 0) cout << "IGNORED" << endl;
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了