zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Button与Submit调用前台与后台代码的方法
    ASP.NET前台代码绑定后台变量方法总结
    点击后禁用提交按钮
    SilverLight3测试(1): Message: AG_E_NETWORK_ERROR
    SilverLight 问题解决
    XmlSerializers.dll.deploy 未成功
    命令模式泛型?问题?
    SilverLight 收藏(2009年3月27日)
    在Web安装工程中为虚拟目录指定不同的本地路径
    Silverlight 3 Sample Application: Slidentity
  • 原文地址:https://www.cnblogs.com/dudulukeyxian/p/10609852.html
Copyright © 2011-2022 走看看