这是一道2014年3月CCF-CSP考试真题第2题,也是本周的一道作业题,先看题目描述。
窗口的编号是始终不变的,这一点首先要明确,我一开始做题以为窗口编号是随位置变化而变化的,其实这是错误的。
接下来开始讲解这一题
窗口用结构体来实现,其成员包括5个整型数据,4个坐标点和一个编号。我们用顺序表来实现这道题。
typedef struct
{
int x1,x2,y1,y2;
int no;
}window;
然后我们开始输入窗口的数量以及“点击”的数量,接着输入窗口的信息,这些比较好实现。此处需注意窗口先输入的在下层,后输入的在上层。
紧接着我们就要输入“点击”的信息,每次点击我们需要对窗口的顺序做一个调整,这是这道题目的关键。每次我没得到点击的信息,需要把点击的信息依次从最上层(也就是窗口数组最后一个)的窗口进行比对,若点击点在当前窗口范围内,则输出窗口编号,然后把此窗口放在最上层(数组最后一个),其他的窗口顺序依次调整,此时需要用到顺序表的相关操作
整体代码见下
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int x1,x2,y1,y2;
int no;
}window;
window win[10];
void exchange(int pos,int wincount)
{
int i;
window temp;
temp=win[pos];
for(i=pos+1;i<=wincount;i++)
{
win[i-1]=win[i];
}
win[wincount]=temp;
}
int main()
{
int wincount,cnt,i,j,flag;
int X1,X2,Y1,Y2;
scanf("%d",&wincount);
scanf("%d",&cnt);
for(i=1;i<=wincount;i++)
{
scanf("%d %d %d %d",&X1,&Y1,&X2,&Y2);
win[i].no=i;
win[i].x1=X1;
win[i].x2=X2;
win[i].y1=Y1;
win[i].y2=Y2;
}
for(i=1;i<=cnt;i++)
{
scanf("%d %d",&X1,&Y1);
flag=1;
for(j=wincount;j>=1;j--)
{
if(win[j].x1<=X1&&win[j].x2>=X1&&win[j].y1<=Y1&&win[j].y2>=Y1)
{
printf("%d\n",win[j].no);
flag=0;
exchange(j,wincount);
break;
}
}
if(flag)
printf("IGNORED\n");
}
return 0;
}
全文完,欢迎评论区探讨