CCF CSP 201403-2 ventana (100)

201403-2
preguntas Nombre: Ventana
1,0s: Plazo
Límite de memoria: 256.0MB

Descripción del problema
  En un sistema operativo gráfico, hay N ventanas, son respectivamente un eje de coordenadas paralela a dos lados de una zona rectangular de cada ventana. Los puntos sobre el límite de la ventana pertenecen a la ventana. Una diferencia entre el nivel de la ventana, más de una ventana en una superposición región, la ventana superior mostrará el contenido.
  Al hacer clic en un punto en la pantalla cuando se hace clic en la elección de la ubicación en la ventana superior, y la ventana se le trasladó a la más alta de todas las ventanas, mientras que el resto de la orden jerárquico de la misma ventana. Si hace clic en un lugar que no pertenece a ninguna ventana, el sistema ignorará hace clic sobre este.
  Ahora queremos que escriba un programa para simular un click en la ventana del proceso.
Formato de entrada
  primera línea de entrada tiene dos números enteros positivos, es decir, N y M. (1 ≤ N ≤ 10,1 ≤ M ≤ 10)
  siguiente fila da la posición N de las ventanas de N en orden desde el más alto al orden más inferior. Cada fila contiene cuatro números enteros no negativos x1, y1, x2, y2, representan un par de coordenadas de los vértices de la ventana son (x1, y1) y (x2, y2). Asegúrese de que x1 <x2, y1 2.
  líneas Siguiente M contiene dos números enteros no negativos x, y, un gráfico de un clic del ratón.
  Título involucrado en todos los puntos y el vértice x del rectángulo, coordenadas y de no más de 2,559 y 1,439, respectivamente.
Formato de salida
  de salida incluye M filas, cada fila representa los resultados de un clic del ratón. Si haga clic en el ratón para seleccionar una ventana, el número de la ventana de salida (en el orden de la ventana de entrada está numerada de 1 a N), si no, las salidas "hizo caso omiso" (sin comillas).
entrada de la muestra
. 3. 4
0 0. 4. 4
. 1. 5. 1. 5
2 2. 6. 6
. 1. 1
0 0
. 4. 4
0. 5
muestras de salida
2
1
1
IGNORADAS
shows muestra
  la posición de la primera clic pertenece a la primera y segunda ventanas, pero desde la segunda ventana de arriba, que se selecciona y se coloca en la capa superior.
  Sólo la segunda posición de una ventana perteneciente a la primera, de modo que los puntos de vista de la ventana seleccionada y en la parte delantera. relación jerárquica con el estado inicial de los actuales tres ventanas de lo contrario.
  Tercera posición de clic, mientras que en el ámbito de las tres ventanas, pero ahora desde la primera ventana en el nivel superior, que está seleccionado.
  Por último, haga clic en el (0, 5) no pertenece a ninguna ventana.

Pensando:
estructura de ventana ck representa el número de bandera añadido a la ventana de entrada, las primeras capas están en la capa indica (por ejemplo, la capa superior es 1); una entrada de coordinar cada vez, de acuerdo con el ascendente ck array bandera secuencialmente y asegúrese de que cada arranque se inicia en la parte superior, si el punto no existe en la ventana, que atraviesa secuencialmente la capa superficial.
Cuando se introducen las coordenadas si la declaración de la ventana de un punto, si la ventana no es el nivel superior, es en sí encuentra en frente de la ventana o retroceder una, y esa ventana se convierte en la parte superior, por el contrario no cambie el orden.

#include <iostream>
#include <algorithm>
using namespace std;

struct point{
    int x,y;
}po[11];

struct ck{
    struct point p1,p2;
    int flag,layer; //flag表示第几个窗口 layer表示从上往下第几层
}ck[11];

bool cmp(struct ck a ,struct ck b)
{
    return a.flag < b.flag; //从顶层开始查看 点是否包含于当前窗口
}

int main()
{
    int n,m,ans[11];
    
    cin >> n >> m;
    
    //n个窗口
    for(int i = 0;i < n;i++)
    {
        cin >> ck[i].p1.x >> ck[i].p1.y;
        cin >> ck[i].p2.x >> ck[i].p2.y;
        ck[i].layer = i+1; //第i个窗口
        ck[i].flag = n-i; //越先输入越底层  最后输入的为顶层 1
    }
    //m次点击
    for(int i = 0;i < m;i++)
    {
        int have = 0;
        sort(ck,ck+n,cmp); //按flag从小到大排序
        
        cin >> po[i].x >> po[i].y;
        for(int j = 0;j < n;j++)
        {
            if(po[i].x >= ck[j].p1.x && po[i].y>= ck[j].p1.y && po[i].x <= ck[j].p2.x && po[i].y <= ck[j].p2.y)
            {
                have = 1;
                //cout << endl << ck[j].layer;
                ans[i] = ck[j].layer;
                if(ck[j].flag != 1) //如果本身就是顶层则不用改变名次
                {
                    ck[j].flag = 1;
                    for(int k = 0;k < j;k++)
                    {
                       ck[k].flag++; //往后退一名
                    }
                }
                break;
            }
        }
        if(have == 0)
        {
            ans[i] = 0;//没找到
        }
    }
    
    for(int i = 0;i < m;i++)
    {
        if(ans[i] != 0)
        {
            cout << ans[i] << endl;
        }
        else{
            cout << "IGNORED" << endl;
        }
    }
    
    return 0;
}

Publicado seis artículos originales · ganado elogios 0 · Vistas 41

Supongo que te gusta

Origin blog.csdn.net/weixin_41809467/article/details/104801947
Recomendado
Clasificación