zoukankan      html  css  js  c++  java
  • CCF真题之窗口

    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) 不属于任何窗口。
     
    源代码:
     
    #include <iostream>
    #include <algorithm>
    using namespace std;
    struct rec
    {
     int x1;
     int x2;
     int y1;
     int y2;
     int id;
     int prior;
    }a[11];
    int main()
    {
     int n,m,x,y,i,j,k,f;
     bool cmp(rec a,rec b);
     cin>>n>>m;
     for(i=0;i<n;i++)
     {
      cin>>a[i].x1>>a[i].y1>>a[i].x2>>a[i].y2;
      a[i].id=i+1;
      a[i].prior=i+1;
     }
     for(i=0;i<m;i++)
        {
         cin>>x>>y;
         sort(a,a+n,cmp);
         f=0;
         for(j=0;j<n;j++)
         {
          if(x>=a[j].x1&&x<=a[j].x2&&y>=a[j].y1&&y<=a[j].y2)
          {
           cout<<a[j].id<<endl;
           f=1;
           if(j==0) break;//如果是最顶层的那个,则直接退出,因为优先级不需要改变
        else
        {
         a[j].prior=n;
         for(k=0;k<j;k++) //优先级比当前矩形要高的,均要优先级降一个
         a[k].prior=a[k].prior-1;
         break;
        }  
          }
         }
         if(f==0) cout<<"IGNORED"<<endl;
         
        }
        return 0;
    }
    bool cmp(rec a,rec b)
    {
     if(a.prior>b.prior)
     return true;
     else
     return false;
    }
     
  • 相关阅读:
    Python入门-函数进阶
    Python入门-初始函数
    Leetcode300. Longest Increasing Subsequence最长上升子序列
    Leetcode139. Word Break单词拆分
    Leetcode279. Perfect Squares完全平方数
    Leetcode319. Bulb Switcher灯泡开关
    Leetcode322. Coin Change零钱兑换
    二叉树三种遍历两种方法(递归和迭代)
    Leetcode145. Binary Tree Postorder Traversal二叉树的后序遍历
    Leetcode515. Find Largest Value in Each Tree Row在每个树行中找最大值
  • 原文地址:https://www.cnblogs.com/lchzls/p/5034343.html
Copyright © 2011-2022 走看看