问题描述
在某图形操作系统中,有 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。
接下来 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
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
1
IGNORED
样例说明
第一次点击的位置同时属于第 1 和第 2 个窗口,但是由于第 2 个窗口在上面,它被选择并且被置于顶层。
第二次点击的位置只属于第 1 个窗口,因此该次点击选择了此窗口并将其置于顶层。现在的三个窗口的层次关系与初始状态恰好相反了。
第三次点击的位置同时属于三个窗口的范围,但是由于现在第 1 个窗口处于顶层,它被选择。
最后点击的 (0, 5) 不属于任何窗口。
第二次点击的位置只属于第 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 }