• ZOJ 2480


    Simplest Task in Windows

    Time Limit: 2 Seconds      Memory Limit: 65536 KB

    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
    ",j);
    32                         flag=1;
    33                         break;
    34                     }
    35                 }
    36                 if(!flag) printf("-1
    ");
    37             }
    38             scanf("%d",&N);
    39     }
    40     return 0;
    41 }
    1、因为漏写了那个break纠结了蛮久的,所以以后碰到循环都稍微想一想什么时候该停下来
    2、因为忘记初始化win数组也纠结了一会,所以以后碰到数组都要记得初始化
    3、因为窗口输入顺序是back to front,注意逆序寻找窗口
     
    方法二:
     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
    ",win[cx][cy]);
    34                     flag=1;
    35                 }
    36                 if(!flag) printf("-1
    ");
    37             }
    38             scanf("%d",&N);
    39     }
    40     return 0;
    41 }

    根据别人的思路打的,这个思路也不错,用二维数组模拟一块屏幕,但是因为题目没有提及coordinate的xy取值范围,所以win的大小其实不好拿捏,但是这个107能AC

  • 相关阅读:
    引领云原生2.0,华为云加速云原生全行业落地!
    【STM32H7】第22章 ThreadX GUIX窗口图标滑动操作实现方法
    【STM32F429】第21章 ThreadX GUIX窗口图标滑动操作实现方法
    【STM32H7】第21章 ThreadX GUIX外置主题,字库和图库到外部SPI Flash
    【STM32F429】第20章 ThreadX GUIX外置主题,字库和图库到外部SPI Flash
    【STM32H7】第20章 ThreadX GUIX汉字显示(QSPI Flash全字库)
    【STM32H7】第19章 ThreadX GUIX的OLED单色屏移植
    【STM32F429】第19章 ThreadX GUIX的OLED单色屏移植
    第28届全球超顶级PCB设计PK结果公布,含炫酷PCB设计效果展示(2020-12-28)
    H7-TOOL固件升级至V1.45,增加上位机截图功能(2020-12-27)
  • 原文地址:https://www.cnblogs.com/dudulukeyxian/p/10609852.html
Copyright © 2020-2023  润新知