ZOJ 2480 - Simplest Task in Windows
A typical windows platform may have several windows on the desktop. A user's operation may be as simple as a single click of the mouse. In the implementation of such a windows platform, one of the simplest tasks would be deciding which window had been clicked.
Given a serial of windows, for each mouse click, decide which window had been clicked. Please notice that windows may overlap, and the window on top would receive the click rather than others. And, we consider a window to be clicked even if the mouse is just on its edge/corner. For the sake of simplicity, we assume that a window will not be activated to the top by any click.
Input
The first part of input is a serial of windows. First an integer N (1 <= N <= 10) is given, indicating the number of windows. Then N lines follow, each containing four integers, x1, y1, x2, y2, (x1 < x2, y1 < y2) the coordinates of the upper-left and lower-right corners of a window. The windows are given in back-to-front order. N=0 signals the end of input.
The second part of input is a serial of mouse clicks. First an integer M (1 <= M <= 50) is given, indicating the number of mouse clicks. Then M lines follow, each containing two integers, x and y, the coordinates of a mouse click.
Output
For each mouse click in the input, output a single line containing the index (starting from 0) of the window which receives the click. If there is no such window, output "-1" in a line instead.
Sample Input
1
0 0 5 5
3
4 1
5 1
6 1
0
Sample Output
0
0
-1
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 int win[15][4]; 5 int main() 6 { int N; 7 scanf("%d",&N); 8 while(N>0){ 9 for(int i=0;i<N;i++) 10 for(int j=0;j<4;j++) 11 win[i][j]=-1; 12 for(int i=0;i<N;i++){ 13 for(int j=0;j<4;j++){ 14 int temp; 15 scanf("%d",&temp); 16 win[i][j]=temp; 17 } 18 } 19 int M; 20 bool flag=0; 21 scanf("%d",&M); 22 for(int i=0;i<M;i++){ 23 flag=0; 24 int cx,cy; 25 scanf("%d",&cx); 26 scanf("%d",&cy); 27 for(int j=N-1;j>=0;j--){ 28 if(win[i][j]==-1) 29 continue; 30 if(cx<=win[j][2]&&cx>=win[j][0]&&cy<=win[j][3]&&cy>=win[j][1]){ 31 printf("%d\n",j); 32 flag=1; 33 break; 34 } 35 } 36 if(!flag) printf("-1\n"); 37 } 38 scanf("%d",&N); 39 } 40 return 0; 41 }
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 int win[107][107]; 5 int main() 6 { int N; 7 scanf("%d",&N); 8 while(N>0){ 9 for(int i=0;i<107;i++){ 10 for(int j=0;j<107;j++) 11 win[i][j]=-1; 12 } 13 for(int i=0;i<N;i++){ 14 int l,d,r,u; 15 scanf("%d",&l); 16 scanf("%d",&d); 17 scanf("%d",&r); 18 scanf("%d",&u); 19 for(int j=l;j<=r;j++){ 20 for(int k=d;k<=u;k++) 21 win[j][k]=i; 22 } 23 } 24 int M; 25 bool flag=0; 26 scanf("%d",&M); 27 for(int i=0;i<M;i++){ 28 flag=0; 29 int cx,cy; 30 scanf("%d",&cx); 31 scanf("%d",&cy); 32 if(win[cx][cy]!=-1){ 33 printf("%d\n",win[cx][cy]); 34 flag=1; 35 } 36 if(!flag) printf("-1\n"); 37 } 38 scanf("%d",&N); 39 } 40 return 0; 41 }
根据别人的思路打的,这个思路也不错,用二维数组模拟一块屏幕,但是因为题目没有提及coordinate的xy取值范围,所以win的大小其实不好拿捏,但是这个107能AC