试题编号: 201403-2
时间限制: 1.0s
内存限制: 256.0MB
问题描述
在某图形操作系统中,有 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) 不属于任何窗口。
解题思路:
实现标准代码(java):
1 package ccf_test2014_03; 2 3 import java.util.Scanner; 4 5 public class Window { 6 7 private static int N; 8 9 private static int M; 10 11 12 13 public static void main(String[] args) { 14 15 Scanner input = new Scanner(System.in); 16 17 N = input.nextInt(); 18 19 M = input.nextInt(); 20 21 22 int[][]page = new int[N + 1][4]; 23 24 int [][] screen = new int[2560][1440]; 25 26 for(int i = 1; i <= N; i++){ 27 28 int x1 = input.nextInt(); 29 30 int y1 = input.nextInt(); 31 32 int x2 = input.nextInt(); 33 34 int y2 = input.nextInt(); 35 36 page[i][0] = x1; 37 38 page[i][1] = y1; 39 40 page[i][2] = x2; 41 42 page[i][3] = y2; 43 44 for(int p = x1; p <= x2; p++){ 45 46 for(int q = y1; q <= y2; q++){ 47 48 screen[p][q] = i; 49 } 50 } 51 52 53 54 } 55 for(int i = 0; i < M; i++){ 56 57 int x = input.nextInt(); 58 59 int y = input.nextInt(); 60 61 int num = screen[x][y]; 62 63 if(num == 0){ 64 65 System.out.println("IGNORED"); 66 67 }else{ 68 69 System.out.println(num); 70 71 int x1 = page[num][0]; 72 73 int y1 = page[num][1]; 74 75 int x2 = page[num][2]; 76 77 int y2 = page[num][3]; 78 79 for(int p = x1; p <= x2; p++){ 80 81 for(int q = y1; q <= y2; q++){ 82 83 screen[p][q] = num; 84 } 85 } 86 } 87 88 } 89 90 } 91 92 }
实现标准代码(c++):
1 #include <iostream> 2 3 using namespace std; 4 5 int screen[2560][1440]; 6 7 int main(){ 8 int n,m; 9 cin>>n>>m; 10 int page[n+1][4]; 11 for(int i=1;i<=n;i++) 12 { 13 int x1,x2,y1,y2; 14 cin>>x1>>y1>>x2>>y2; 15 page[i][0]=x1; 16 page[i][1]=y1; 17 page[i][2]=x2; 18 page[i][3]=y2; 19 for(int p=x1;p<=x2;p++) 20 for(int q=y1;q<=y2;q++) 21 screen[p][q] = i; 22 } 23 for(int i=0;i<m;i++) 24 { 25 int x,y; 26 cin>>x>>y; 27 int num = screen[x][y]; 28 if(num == 0) 29 { 30 cout<<"IGNORED"<<endl; 31 } 32 else 33 { 34 cout<<num<<endl; 35 int x1(page[num][0]),y1(page[num][1]),x2(page[num][2]),y2(page[num][3]); 36 for(int p=x1;p<=x2;p++) 37 for(int q=y1;q<=y2;q++) 38 screen[p][q] = num; 39 } 40 } 41 return 0; 42 }
我的实现代码(java):
1 package ccf_test2014_03; 2 3 import java.util.Scanner; 4 5 public class Window2 { 6 7 private static int N; 8 9 private static int M; 10 11 12 13 public static void main(String[] args) { 14 15 Scanner input = new Scanner(System.in); 16 17 N = input.nextInt(); 18 19 M = input.nextInt(); 20 21 input.nextLine(); 22 23 int[][]a = new int[N][5]; 24 25 int[][]b = new int[M][2]; 26 27 int []prior = new int[N]; 28 29 for(int i = 0; i < N; i++){ 30 31 a[i][0] = input.nextInt(); 32 33 a[i][1] = input.nextInt(); 34 35 a[i][2] = input.nextInt(); 36 37 a[i][3] = input.nextInt(); 38 39 input.nextLine(); 40 41 prior[i] = i; 42 } 43 44 for(int i = 0; i < M; i++){ 45 46 b[i][0] = input.nextInt(); 47 48 b[i][1] = input.nextInt(); 49 50 input.nextLine(); 51 52 } 53 54 int [] temp = new int[11]; 55 56 int k = 0; 57 58 int max = 0; 59 60 int it = 0; 61 62 for(int i = 0; i < M; i++){ 63 64 for(int j = 0; j < N - 1; j++){ 65 66 boolean condition = (b[i][0] >=a[j][0])&&(b[i][1] >=a[j][1])&&(b[i][0] <=a[j][2])&&(b[i][1] <=a[j][3]); 67 68 if(condition){ 69 70 temp[k++] = j; 71 72 } 73 74 } 75 76 if(k == 0){ 77 78 System.out.println("IGNORED"); 79 }else if(k == 1){ 80 81 for(int j = 0 ; j < N; j++){ 82 83 if(j == temp[0]){ 84 85 prior[j]= N - 1; 86 }else{ 87 88 prior[j]--; 89 } 90 } 91 92 System.out.println(temp[0]+1); 93 94 }else{ 95 96 for(int j = 0 ; j < k; j++){ 97 98 if(prior[temp[j]] > max){ 99 100 max = prior[temp[j]]; 101 it = j; 102 } 103 } 104 System.out.println(temp[it]+1); 105 } 106 k= 0; 107 108 } 109 110 } 111 112 }
三个代码顺序运行结果: