该题是一道纯粹的模拟题,主要在于看懂题意后使用程序模拟出来即可
这里我定义了一个结构体数组来存储每一个窗口的范围以及编号(因为需要输出窗口原来的编号)
此外我们将这个结构体数组的下标从小到大看作每一个窗口从底部向顶部增长
然后每次点击一个位置,就自顶向底部遍历窗口,如果该位置属于某个窗口,就将其放到顶部,其他窗口按照原来的相对顺序腾出一个位置给顶部即可
#include<iostream> using namespace std; typedef struct Node{ int x1,y1,x2,y2; int id; }Node; int n,m; Node windows[20];//存储窗口,同时下标从小到大代表窗口自底向顶 bool belong(int x,int y,int index){//判断(x,y)是否属于下标为index的窗口 Node temp=windows[index]; return (x>=temp.x1&&y>=temp.y1)&&(x<=temp.x2&&y<=temp.y2); } bool change(int x,int y){ for(int i=n;i>=1;i--){ if(belong(x,y,i)){ Node temp=windows[i]; for(int j=i;j<=n-1;j++){ windows[j]=windows[j+1]; } windows[n]=temp;//将其挪到最顶部 return true; } } return false;//不属于任何一个窗口 } int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ cin>>windows[i].x1>>windows[i].y1>>windows[i].x2>>windows[i].y2; windows[i].id=i; } for(int i=1;i<=m;i++){ int x,y; cin>>x>>y; //每次点击一个位置,就自顶向底部遍历窗口,如果该位置属于某个窗口,就将其放到顶部 if(change(x,y)){ cout<<windows[n].id<<endl; }else{ cout<<"IGNORED"<<endl; } // for(int i=1;i<=n;i++){//调试 // cout<<windows[i].id<<" "; // } // cout<<endl; } return 0; }
此外,参考了他人的博客,我们还可以直接将每个窗口的顺序定义在结构体中,然后可以通过内置函数sort进行降序排序,从而实现窗口的排序
CCF-CSP 2014-03-2 窗口(模拟)
最新推荐文章于 2024-08-22 17:27:46 发布