• 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) 不属于任何窗口。
     
    _________________________________________________________________________________________________________________________________________
    使用STL 的 删除,插入(顶部),我是自己模拟了,注意要换行 ,另外要直接对数组该,改vector无效
    (1)STL    v.erase(iterator)   v.insert(inerator,value)
     1 #include<iostream>
     2 #include<vector>
     3 using namespace std;
     4 
     5 struct node
     6 {
     7     int x1,y1,x2,y2;
     8     int num;
     9     node(int a=0,int b=0,int c=0,int d=0,int e=0):x1(a),y1(b),x2(c),y2(d),num(e){        //     必须 得赋 初  值    ! ! ??   
    10     }
    11  };
    12 vector<node>windows;
    13 
    14 int find(int x,int y,node t)
    15 {
    16     if (x>=t.x1 && x<=t.x2 && y>=t.y1 && y<=t.y2)return 1;
    17     else return 0;
    18 }
    19 
    20 void search(int x,int y)
    21 {
    22     for (int i=0;i<windows.size();i++)
    23     {
    24         if(find(x,y,windows[i]))
    25         {
    26             cout<<windows[i].num<<endl;
    27 //            vector<node>::iterator it= windows.begin();  // 多余!!! 
    28             node tmp = windows[i];                     /// ???? 
    29             windows.erase(windows.begin()+i);
    30             windows.insert(windows.begin(),tmp);
    31             return ;
    32         }
    33     }
    34     cout<<"IGNORED"<<endl;
    35     
    36 }
    37 
    38 int main()
    39 {
    40     
    41     int n,m;
    42     cin>>n>>m;
    43     windows.resize(n);
    44     
    45     for (int i =0;i<n;i++)
    46     {
    47         int x1,y1,x2,y2;
    48         cin>>x1>>y1>>x2>>y2;
    49         windows[n-i-1]= node(x1,y1,x2,y2,i+1);            //                      window[i] = node()   ! ! !  ! !
    50         
    51      } 
    52      
    53      for (int i = 0;i<m;i++)
    54      {
    55          int x,y;
    56          cin>>x>>y;
    57          
    58          search(x,y);
    59          
    60      }
    61     
    62     
    63     return 0;
    64     
    65 }

    (2)  模拟

     1 #include<iostream>
     2 #include<vector>
     3 using namespace std;
     4 
     5 struct node
     6 {
     7     int x1,x2,y1,y2;
     8     int priority;
     9     int num;
    10     
    11 };
    12 
    13 int main()
    14 {
    15     int n,m;
    16     cin>>n>>m;
    17     
    18     struct node a[n];
    19     
    20     for (int i=0;i<n;i++)
    21     {
    22         int x1,y1,x2,y2;
    23         cin>>x1>>y1>>x2>>y2;                    //      结     构体的初始化 ,以及分配内存   
    24         a[i].x1 = x1;
    25         a[i].y1 = y1;
    26         a[i].x2 = x2;
    27         a[i].y2 = y2;
    28         a[i].priority = i; 
    29         a[i].num =i+1;
    30     }
    31     
    32     vector<int>v;
    33     
    34     for (int i = 0;i<m;i++)
    35     {
    36         int x,y;
    37         cin>>x>>y;
    38          
    39         for (int j = 0;j<n;j++)      // 寻找属于哪个窗口   ,  如果没有 
    40         {
    41             int x1,y1,x2,y2;
    42             x1 = a[j].x1; y1 = a[j].y1; x2 = a[j].x2; y2 = a[j].y2;
    43             if (x >= x1 && x <=x2 && y >= y1 && y <= y2)v.push_back(j);        //     v 只保存下标! 
    44         }
    45         
    46         
    47         
    48         if (v.size() == 0)
    49         {
    50             cout<<"IGNORED"<<endl;
    51             continue;                //  此次循环结束 
    52         }
    53         
    54         int p = a[v[0]].priority;
    55         int chop = a[v[0]].num;
    56         int tmp = 0; 
    57         
    58         for (int j = 1;j<v.size();j++)    //   同 时符合, 比较窗口间的优先级 
    59         {
    60             if (a[v[j]].priority > p)
    61             {
    62                 p = a[v[j]].priority;
    63                 chop = a[v[j]].num;                //选择窗口编号 
    64                 tmp = j;                        
    65             }
    66         }
    67 
    68         a[v[tmp]].priority = 121;                //  将挑选出来的优先级设为最大;           
    69         
    70         
    71         cout<< chop<<endl;                        //   输出结果 
    72         v.clear();                          //   清空 v ; 
    73 
    74         //   调整优先级
    75         
    76         for (int j = 0;j<n;j++)
    77         {
    78             a[j].priority = a[j].priority -1;
    79         } 
    80         
    81     }
    82     
    83     
    84     return 0;
    85  } 

    (3) 错误模拟,, 对 vector 操作,没有影响到 原数组

     1 #include<iostream>
     2 #include<vector>
     3 using namespace std;
     4 
     5 struct node
     6 {
     7     int x1,x2,y1,y2;
     8     int priority;
     9     int num;
    10     
    11 };
    12 
    13 int main()
    14 {
    15     int n,m;
    16     cin>>n>>m;
    17     
    18     struct node a[n];
    19     
    20     for (int i=0;i<n;i++)
    21     {
    22         int x1,y1,x2,y2;
    23         cin>>x1>>y1>>x2>>y2;                    //      结     构体的初始化 ,以及分配内存   
    24         a[i].x1 = x1;
    25         a[i].y1 = y1;
    26         a[i].x2 = x2;
    27         a[i].y2 = y2;
    28         a[i].priority = i; 
    29         a[i].num =i+1;
    30     }
    31     
    32     vector<node>v;
    33 //    v.clear();
    34 //    v.push_back(1);
    35 //    cout<<v.size();
    36 //    
    37     for (int i = 0;i<m;i++)
    38     {
    39         int x,y;
    40         cin>>x>>y;
    41          
    42         for (int j = 0;j<n;j++)      // 寻找属于哪个窗口   ,  如果没有 
    43         {
    44             int x1,y1,x2,y2;
    45             x1 = a[j].x1; y1 = a[j].y1; x2 = a[j].x2; y2 = a[j].y2;
    46             if (x >= x1 && x <=x2 && y >= y1 && y <= y2)v.push_back(a[j]);        // 同时符合 
    47         }
    48         
    49         cout<<"v-->> size: "<< v.size()<<endl;
    50         
    51         for (int j = 0;j<n;j++)cout<<j<<"  priority: -->.  "<<a[j].priority<<"   ";
    52         
    53         if (v.size() == 0)
    54         {
    55             cout<<"IGNORED";
    56             continue;                //  此次循环结束 
    57         }
    58         
    59         int p = v[0].priority;
    60         int chop = v[0].num;
    61         int tmp = 0; 
    62         
    63         for (int j = 1;j<v.size();j++)    //   同 时符合, 比较窗口间的优先级 
    64         {
    65             if (v[j].priority > p)
    66             {
    67                 p = v[j].priority;
    68                 chop = v[j].num;                //选择窗口编号 
    69                 tmp = j;                        
    70             }
    71         }
    72         cout<< "tmp ->> "<<tmp <<endl; 
    73         cout<<"v [tmp]  "<<v[tmp].priority<<endl;
    74         
    75         v[tmp].priority = 11;                //  将挑选出来的优先级设为最大;           //     对 v操作 不影响 a      !! !!!   出现错误
    76         
    77         cout<<"  v[tmp]_change "<< v[tmp].priority<<endl;
    78         
    79         cout<<" x1 ,y1,x2,y2 "<<v[tmp].x1<<" "<<v[tmp].y1<< " "<<v[tmp].x2<<" "<<v[tmp].y2<< " --"<<v[tmp].priority <<endl;
    80         
    81         
    82         cout<< chop <<endl;                        //   输出结果 
    83 //        v.clear();                          //   清空 v ; 
    84 
    85         //   调整优先级
    86         
    87         for (int j = 0;j<n;j++)
    88         {
    89             cout<< a[j].priority<<" ";
    90             a[j].priority = a[j].priority -1;
    91         } 
    92         
    93         
    94         
    95     }
    96     
    97     
    98     return 0;
    99  } 
     
     
  • 相关阅读:
    Codeforces 1325D
    Codeforces 1325C
    Codeforces 1311F
    Codeforces 1311E
    Codeforces 1311D
    Codeforces 1316C
    JVM调试常用命令——jstack命令与线程状态(4)
    JVM调试常用命令——jstack命令与线程状态(3)
    JVM调试常用命令——jstack命令与Java线程栈(2)
    Java中类的比较与排序方法(应用Comparable接口与Comparator接口)
  • 原文地址:https://www.cnblogs.com/wuxiaotianC/p/9503993.html
Copyright © 2020-2023  润新知