思路:数组(栈)模拟优先级的变化。
一.单数组(栈):输入一个窗口坐标入栈一个,栈顶优先级最高。每次点击时,从栈顶弹出窗口与之进行判断是否点击到,若未点击到则向下找,若点击到则当前top位置前的元素想后移一位,留出栈顶位置给当前符合条件的窗口。
注意还原:1.每次成功点击窗口后top重新指向原始栈顶N(N为总的窗口数)2.每次点击若点击不到窗口(s.top==0)则也是重新回到栈顶(s.top=N).
代码:
#include <cstring>
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <stack>
using namespace std;
int a[12][5];
int m[12][3];
typedef struct
{
int data[100];
int top;
}sq;
int main()
{
sq s1;
s1.top=0;
int M,N;
cin>>N>>M;
for(int i=1;i<=N;i++)
{
s1.top++;//窗口号入栈,后入的优先级高
s1.data[s1.top]=i;
for(int j=1;j<=4;j++)
{
cin>>a[i][j];
}
}
for(int i=1;i<=M;i++)
{
for(int j=1;j<=2;j++)
{
cin>>m[i][j];
}
}
int flag=0;
//1.判断点击范围属于哪个窗口2.判断优先级,调整优先级
for(int i=1;i<=M;i++)
{
for(int j=1;j<=N;j++)//最多比较N次
{
int q=s1.data[s1.top];
if(m[i][1]>=a[q][1]&&m[i][1]<=a[q][3]&&m[i][2]>=a[q][2]&&m[i][2]<=a[q][4])//x,y介于x1,x2;y1,y2之间
{
flag=1;
cout<<q<<endl;
//调整点击后的优先级
for(int k=s1.top;k<=N-1;k++)
{
s1.data[k]=s1.data[k+1];
}
s1.data[N]=q;
s1.top=N;
break;
}
else
{
s1.top--;
}
}
if(s1.top==0)//此次点击未点击到窗口
{
cout<<"IGNORED"<<endl;
s1.top=N;
}
}
return 0;
}