窗口问题
问题描述:
在某图形操作系统中,有N个窗口,每个窗口都是一个两边与坐标轴分别平行的矩形区域。窗口的边界上的点也属于该窗口。窗口之间有层次的区别,在多于一个窗口重叠的区域里,只会显示位于顶层的窗口里的内容。
当你点击屏幕上一个点的时候,你就选择了处于被点击位置的最顶层窗口,并且这个窗口就会被移到所有窗口的最顶层,而剩余的窗口的层次顺序不变。如果你点击的位置不属于任何窗口,则系统会忽略你这次点击。
现在我们希望你写一个程序模拟点击窗口的过程。
基本要求:
利用单链表存储结构记录窗口顺序。
Input
输入的第一行有两个正整数,即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。
Output
输出包括M行,每一行表示一次鼠标点击的结果。如果该次鼠标点击选择了一个窗口,则输出这个窗口的编号(窗口按照输入中的顺序从1编号到N);如果没有,则输出"IGNORED"(不含双引号)。
Sample Input
3 4
0 0 4 4
1 1 5 5
2 2 6 6
1 1
0 0
4 4
0 5
Sample Output
2
1
1
IGNORED
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode
{
int x1;
int x2;
int y1;
int y2;
int layer;
int id;
struct LNode *next;
}LNode,*linklist;
linklist CL(linklist L,int n)
{
int i=0;
linklist p,q;
p=(linklist)malloc(sizeof(LNode));
L=p;
q=p;
while(i<n)
{
p=(linklist)malloc(sizeof(LNode));
scanf("%d",&(p->x1));
scanf("%d",&(p->y1));
scanf("%d",&(p->x2));
scanf("%d",&(p->y2));
p->layer=++i;
p->id=p->layer;
q->next=p;
q=q->next;
}
p->next=NULL;
return L;
}
linklist exlist(linklist L,int x,int y,int n)
{
linklist p,q;
int i=0,a,b,c,d;
p=L;
p=p->next;
a=p->layer; //记录现轮层
b=p->layer; //记录最大层
c=0; //记录鼠标有几次在范围里
d=p->id; //记录相对的id位置
while(p && i<n-1)
{
if(b<p->layer)
b=p->layer;
if(p->x2>=x && p->y2>=y && x>=p->x1 && y>=p->y1 && a<=p->layer)
{
c++;
d=p->id;
a=p->layer;
}
p=p->next;
}
if(c==0)
printf("输出:IGNORED\n");
else
{
p=L;
p=p->next;
printf("输出:%d\n",d);
while(p && i<=d-1)
{
if(p->id==d)
p->layer=b+1;
p=p->next;
}
}
return L;
}
linklist showlist(linklist L)
{
linklist p;
p=L;
p=p->next;
while(p){
printf("|%d ",(p->x1));//输出
printf("%d ",(p->y1));
printf("%d ",(p->x2));
printf("%d| ",(p->y2));
printf("%d ",(p->layer));
printf("\n");
if(p->next==NULL)
break;
p=p->next;
}
}
int main()
{
linklist L=NULL;
int m,n,k=0;
int x,y;
scanf("%d",&n);
scanf("%d",&m);
L=CL(L,n);
//showlist(L);
while(k<m)
{scanf("%d%d",&x,&y);
L=exlist(L,x,y,n);
k++;
//showlist(L);
}
return 0;
}
/*
3 4
0 0 4 4
1 1 5 5
2 2 6 6
1 1
0 0
4 4
0 5
*/