一、题目
二、解题
1.思路
模拟窗口的排列和移动过程,给定的窗口具有不同的位置和大小。对于每个查询,程序需要找到包含给定坐标的窗口,并将其移到窗口列表的最前面。
代码思路:
- 读入窗口数量N和查询次数M,然后读入每个窗口的初始位置。
- 将窗口的编号压入整数向量V,该向量中的编号排列顺序为:最后一个窗口的编号在第一个,第一个窗口的编号在最后一个。
- 对于每个查询,读入坐标x和y,并迭代整数向量V,使用Judge_In函数检查它是否在当前窗口中。
- 如果找到包含(x,y)的窗口,则输出其编号,并将该编号存储在store中。将该编号从向量V中删除,并在开头插入,保证当前查询找到的窗口移动到窗口列表的开头。
- 如果未找到任何窗口,则输出“IGNORED”。
2.代码
dev c++ 5.11
#include<bits/stdc++.h>
using namespace std;
vector<int> V;
struct Area{
int x1,y1;
int x2,y2;
}Win_Area[15];
bool Judge_On(int x,int y,int no){
if(x>=Win_Area[no].x1 && x<=Win_Area[no].x2 && y>=Win_Area[no].y1 && y<=Win_Area[no].y2){
return true;
}else{
return false;
}
}
int main(){
int N,M;
cin>>N>>M;
for(int i=1;i<=N;i++){
cin>>Win_Area[i].x1>>Win_Area[i].y1>>Win_Area[i].x2>>Win_Area[i].y2;
V.push_back(N-i+1);//窗口从最下层开始存储
}
for(int i=0;i<M;i++){
int x,y;
cin>>x>>y;
for(auto it=V.begin();it!=V.end();it++){
if(Judge_On(x,y,*it)){
cout<<*it<<endl;
int temp=*it;
V.erase(it);
V.insert(V.begin(),temp);
x=-1;
break;
}
}
if(x!=-1) cout<<"IGNORED"<<endl;
}
return 0;
}
3.提交结果
总结
1.解释:
for(int i=0;i<M;i++){
int x,y;
cin>>x>>y;
for(auto it=V.begin();it!=V.end();it++){
if(Judge_On(x,y,*it)){
cout<<*it<<endl;
int temp=*it;
V.erase(it);
V.insert(V.begin(),temp);
x=-1;
break;
}
}
if(x!=-1) cout<<"IGNORED"<<endl;
}
遍历一个名为V的向量,每次读取一对整数x和y,如果在V中找到了满足Judge_In(x, y, *it)为真的元素,则将该元素移动到向量的开头。如果在V中没有找到这样的元素,则输出"IGNORED"。
其中,x=-1的作用是标记找到了一个匹配的元素,使用break退出循环,以避免未找到匹配的元素时还输出"IGNORED"。