201403-2 | |
试题名称: | 窗口 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 在某图形操作系统中,有 N 个窗口,每个窗口都是一个两边与坐标轴分别平行的矩形区域。窗口的边界上的点也属于该窗口。窗口之间有层次的区别,在多于一个窗口重叠的区域里,只会显示位于顶层的窗口里的内容。 输入格式 输入的第一行有两个正整数,即 N 和 M。(1 ≤ N ≤ 10,1 ≤ M ≤ 10) 输出格式 输出包括 M 行,每一行表示一次鼠标点击的结果。如果该次鼠标点击选择了一个窗口,则输出这个窗口的编号(窗口按照输入中的顺序从 1 编号到 N);如果没有,则输出"IGNORED"(不含双引号)。 样例输入 3 4 样例输出 2 样例说明 第一次点击的位置同时属于第 1 和第 2 个窗口,但是由于第 2 个窗口在上面,它被选择并且被置于顶层。 |
#include<iostream>
#include<stdlib.h>
#include<cstdlib>
using namespace std;
typedef struct node
{
int X1,X2,Y1,Y2,number;
struct node *next;
}node,*Node;
void Create(Node &H,int n)
{
if(H==NULL)
{
H=(Node)malloc(sizeof(node));
H->next=NULL;
}
if(!H)exit(0);
node *p1,*p2;
p1=H->next;
for(int i=0;i<n;i++)
{
p2=(Node)malloc(sizeof(node));
cin>>p2->X1>>p2->Y1>>p2->X2>>p2->Y2;
p2->number=i+1;
H->next=p2;
p2->next=p1;
p1=p2;
}
}
int Click(Node& H,int x,int y)
{
node *p,*p1;
p1=H;
p=p1->next;
while(p)
{
if((x>=p->X1)&&(x<=p->X2)&&(y>=p->Y1)&&(y<=p->Y2))
{
p1->next=p->next;
p->next=H->next;//移到头结点后
H->next=p;
return p->number;
}
else
{
p1=p;
p=p->next;
}
}
return -1;
}
int main()
{
int num[10];
int M,N,x,y;
cin>>N>>M;
Node H=NULL;
Create(H,N);
for(int i=0;i<M;i++)
{
cin>>x>>y;
num[i]=Click(H,x,y);
}
for(int i=0;i<M;i++)
{
if(num[i]==-1)
{
cout<<"IGNORED"<<endl;
}
else
{
cout<<num[i]<<endl;
}
}
free(H);
H=NULL;
return 0;
}