CSP 201403-2 窗口【c语言】

针对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

否则运行错误

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用\[1\]和引用\[2\]中的C++代码,这是一个解决csp201409-2问题的代码。该问题的具体描述没有提供,但是根据代码的内容可以推测,这个问题涉及到计算矩形的重叠面积。 引用\[1\]中的代码使用了一个二维向量来存储矩形的坐标信息,并通过遍历计算重叠的面积。引用\[2\]中的代码使用了一个二维数组来表示矩形,并通过遍历数组来计算重叠的面积。 引用\[3\]中的描述提到了解决这个问题的思路。他们尝试了不同的方法,但都面临着面积重叠的问题。 综上所述,这段代码是用来解决csp201409-2问题的,具体问题描述没有提供,但是代码中的逻辑可以用来计算矩形的重叠面积。 #### 引用[.reference_title] - *1* *3* [【csp201409-2】画图](https://blog.csdn.net/weixin_51305111/article/details/128713458)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [csp 201409-2 画图(含解析思路)](https://blog.csdn.net/weixin_44915226/article/details/108582368)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值