针对CSP这道题,作为第二道要比201312-2要难一些,不过也没有难到哪里去,只要理解题意,做起来还是很简单很简单的
不过题目下方还是贴心的添加了题目的解读,如果不会可以思考一下,加油
前言
这篇文章大概介绍了csp测试模拟题的201403-2,大概浏览了一下题目,越是接近最新考题(2023年)题目就越复杂冗长,我还是喜欢题目简洁一些的,所以,喜欢从最旧的考题开始做,建议大家也和我一样,给自己一些信心,加油!
一、题目
问题描述
在某图形操作系统中,有 N 个窗口,每个窗口都是一个两边与坐标轴分别平行的矩形区域。窗口的边界上的点也属于该窗口。窗口之间有层次的区别,在多于一个窗口重叠的区域里,只会显示位于顶层的窗口里的内容。
当你点击屏幕上一个点的时候,你就选择了处于被点击位置的最顶层窗口,并且这个窗口就会被移到所有窗口的最顶层,而剩余的窗口的层次顺序不变。如果你点击的位置不属于任何窗口,则系统会忽略你这次点击。
现在我们希望你写一个程序模拟点击窗口的过程。
输入格式
输入的第一行有两个正整数,即 N 和 M。(1 ≤ N ≤ 10,1 ≤ M ≤ 10)
接下来 N 行按照从最下层到最顶层的顺序给出 N 个窗口的位置。 每行包含四个非负整数 x1, y1, x2, y2,表示该窗口的一对顶点坐标分别为 (x1, y1) 和 (x2, y2)。保证 x1 < x2,y1 2。
接下来 M 行每行包含两个非负整数 x, y,表示一次鼠标点击的坐标。
题目中涉及到的所有点和矩形的顶点的 x, y 坐标分别不超过 2559 和 1439。
输出格式
输出包括 M 行,每一行表示一次鼠标点击的结果。如果该次鼠标点击选择了一个窗口,则输出这个窗口的编号(窗口按照输入中的顺序从 1 编号到 N);如果没有,则输出"IGNORED"(不含双引号)。
样例输入
3 4
0 0 4 4
1 1 5 5
2 2 6 6
1 1
0 0
4 4
0 5
样例输出
2
1
1
IGNORED
样例说明
第一次点击的位置同时属于第 1 和第 2 个窗口,但是由于第 2 个窗口在上面,它被选择并且被置于顶层。
第二次点击的位置只属于第 1 个窗口,因此该次点击选择了此窗口并将其置于顶层。现在的三个窗口的层次关系与初始状态恰好相反了。
第三次点击的位置同时属于三个窗口的范围,但是由于现在第 1 个窗口处于顶层,它被选择。
最后点击的 (0, 5) 不属于任何窗口。
二、解题思路
1.了解题目含义
注意的是,这个是很贴近生活的一道题目,在日常生活中,我们最后打开的网页在最上面,点击位于下面的网页时,所点击的网页会置顶,我们用页面的两个对角顶点代表网页范围,点击位置用坐标表示
2.博主有话说
在最开始的时候,博主也没怎么读题,因为样例的点击位置刚好是临界点位置,所以博主就让坐标等于两个临界点其中的一个才会显示点击页面的编号
第二个错误是博主并没有改变置顶页面的位置,导致没有点击页面就会将其置顶 的功能
第三个错误是,博主没有想到页面打开的顺序应该和位置顺序相反,也就是说应该是“后来者居上”
这是博主的三个错误,希望大家可以避免
三、代码
#include<stdio.h>
#include<stdlib.h>
typedef struct list{
int data;
struct list *next;
}list,*plist;
typedef struct sqrt{
int first[2];
int second[2];
}sqrt,*psqrt;
int main(){
sqrt a[11];
plist p=(plist)malloc(sizeof(list));
plist head=p;
int m,n,i;
int x1,y1,x2,y2,x,y;
int j,k;
scanf("%d %d",&m,&n);
for(i=0;i<m;i++){
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
a[i].first[0]=x1;
a[i].first[1]=y1;
a[i].second[0]=x2;
a[i].second[1]=y2;
plist bb=(plist)malloc(sizeof(list));
bb->data=m-i-1;
bb->next=NULL;
p->next=bb;
p=bb;
}
for(i=0;i<n;i++){
scanf("%d %d",&x,&y);
plist bb=head;
int flag=0;
while(bb->next){
j=bb->next->data;
if(x>=a[j].first[0]&&x<=a[j].second[0]&&y>=a[j].first[1]&&y<=a[j].second[1])
{
printf("%d\n",j+1);
flag=1;
plist r=bb->next;
bb->next=bb->next->next;
r->next=head->next;
head->next=r;
break;
}
bb=bb->next;
}
if(flag==0)
printf("IGNORED\n");
}
return 0;
}
解释一下代码
博主和众多程序员一样,喜欢别人的代码有注释,但自己最讨厌写注释
所以,博主在这里解释一下自己的代码
先创建两个结构体,一个存页面信息,一个存位置
然后进入循环----输入信息----点击页面后更新位置链表的信息
其实代码可以更加简介,但是为了好理解,多用了一些中间变量表示位置,所以显得代码有点冗长
给大家看一下运行结果
注意记得写
return 0;
否则运行错误