• CCF CSP 201403-2 窗口 题解


    问题描述

      在某图形操作系统中,有 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. #include
    2. //判断点是否在某个框内
    3. int pd(int x,int y,int a,int b,int c,int d){
    4. if(x>=a&&x<=c&&y>=b&&y<=d) return 1;
    5. else return 0;
    6. }
    7. int main(){
    8. int n,m;
    9. scanf("%d%d",&n,&m);
    10. int window[n][5];
    11. for(int i=0;i0]=i+1;
    12. for(int i=0;i
    13. for(int j=1;j<5;j++){
    14. scanf("%d",&window[i][j]);
    15. }
    16. }
    17. int op[2],x=0,result[10];
    18. for(int i=0;i
    19. for(int j=0;j<2;j++){
    20. scanf("%d",&op[j]);
    21. }
    22. for(int p=n-1;p>=0;p--){
    23. if(pd(op[0],op[1],window[p][1],window[p][2],window[p][3],window[p][4])==1){
    24. //输出该矩形标号,把该矩形移到最顶端
    25. result[x]=window[p][0];
    26. x++;
    27. //将p后面的数组前移,原来的p移到最后一位
    28. //temp存储p
    29. int temp[5];
    30. for(int q=0;q<5;q++) temp[q]=window[p][q];
    31. for(int q=p;q-1;q++) {
    32. for(int r=0;r<5;r++){
    33. window[q][r]=window[q+1][r];
    34. }
    35. }
    36. for(int q=0;q<5;q++) window[n-1][q]=temp[q];
    37. break;
    38. }else if(p==0) {
    39. result[x]=n+2;
    40. x++;
    41. }
    42. }
    43. }
    44. for(int i=0;i<10;i++){
    45. if(result[i]==n+2) printf("IGNORED\n");
    46. else if(result[i]==0) break;
    47. else if(result[i]<=n+1)printf("%d\n",result[i]);
    48. }
    49. return 0;
    50. }

  • 相关阅读:
    Laravel 博客开发|后台项目管理
    STM32F103标准库开发---SPI实验---W25Qxx系列外部Flash芯片
    RocketMQ 系列(三) 集成 SpringBoot
    群体优化算法---蜂群优化算法应用于数据挖掘
    CV经典任务(一) 语义分割、实例分割 | 全卷积
    SpringBoot+Vue项目漫画网站
    Spark在Yarn集群的两种提交模式
    令牌桶算法和漏桶算法各自的应用场景
    InnoDB主键和二级索引树、回表
    【二叉树】最长同值路径
  • 原文地址:https://blog.csdn.net/xxsnsxx/article/details/132647374