201403-2 - 窗口

Posted wuxiaotianc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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  } 

 

 
 


















以上是关于201403-2 - 窗口的主要内容,如果未能解决你的问题,请参考以下文章

201403-2 - 窗口

201403-2 窗口

201403-2窗口

CCF 201403-2 窗口

CCF 201403-2窗口 (STL模拟)

CSP201403-2:窗口