Ventana CCF-CSP 201403-2

Descripción del problema
  En un sistema operativo de gráficos, hay N ventanas, y cada ventana es un área rectangular con dos lados paralelos al eje de coordenadas. Los puntos en el límite de la ventana también pertenecen a la ventana. Existe una diferencia jerárquica entre las ventanas: en un área donde se superponen más de una ventana, solo se muestra el contenido de la ventana en el nivel superior.
  Cuando hace clic en un punto de la pantalla, selecciona la ventana superior en la posición en la que se hizo clic, y esta ventana se moverá al nivel superior de todas las ventanas, y las ventanas restantes están en el mismo orden. Si la ubicación en la que hace clic no pertenece a ninguna ventana, el sistema ignorará su clic.
  Ahora queremos que escriba un programa para simular el proceso de hacer clic en la ventana.
Formato de entrada
  La primera línea de entrada tiene dos enteros positivos, a saber, N y M. (1 ≤ N ≤ 10, 1 ≤ M ≤ 10) Las
  siguientes N líneas dan las posiciones de N ventanas en orden de abajo hacia arriba. Cada línea contiene cuatro enteros no negativos x1, y1, x2, y2, lo que indica que las coordenadas de un par de vértices de la ventana son (x1, y1) y (x2, y2). Asegúrese de que x1 <x2, y1 2.
  Las siguientes líneas M contienen dos enteros no negativos x, y, que representan las coordenadas de un clic del mouse.
  Las coordenadas xey de todos los puntos y vértices rectangulares involucrados en la pregunta no exceden de 2559 y 1439, respectivamente.
El formato de
  salida incluye M líneas, cada línea representa el resultado de un clic del mouse. Si se selecciona una ventana con el clic del mouse, se muestra el número de la ventana (las ventanas se numeran del 1 al N en el orden en que se ingresan); de lo contrario, se muestra "IGNORADO" (sin comillas dobles).
Entrada de muestra
3 4
0 0 4 4
1 1 5 5
2 2 6 6
1 1
0 0
4 4
0 5
Salida de muestra
2
1
1 Descripción de muestra
IGNORADA   La ubicación del primer clic pertenece a las ventanas primera y segunda, pero como la segunda ventana está en la parte superior, se selecciona y se coloca en la capa superior.   La posición del segundo clic solo pertenece a la primera ventana, por lo que este clic selecciona esta ventana y la coloca en el nivel superior. La relación jerárquica actual de las tres ventanas es exactamente lo contrario del estado inicial.   La posición del tercer clic pertenece al alcance de tres ventanas al mismo tiempo, pero como la primera ventana está ahora en la parte superior, está seleccionada.   El último clic (0, 5) no pertenece a ninguna ventana.




Resumen de experiencia:
Estructura de uso, que almacena x1, y1, x2, y2 y número de ventana.
Use el vector para almacenar ventanas una por una. El efecto aparece en la ventana de simulación. El último elemento del vector es la ventana de nivel superior.
Al hacer clic, recorra desde el último elemento del vector para determinar si la coordenada presionada está dentro de este elemento. Si es así, muestre el número de ventana de este elemento, luego agregue este elemento después del último elemento y elimine el elemento de ventana actual (porque se ha convertido en la ventana de nivel superior).

Código C ++:

#include<bits/stdc++.h>
using namespace std;
struct node{
	int x1,y1,x2,y2;
	int rank;
	node(int x1,int y1,int x2,int y2,int rank):x1(x1),y1(y1),x2(x2),y2(y2),rank(rank){}
};
int main() {
	int n,m;
	cin>>n>>m;
	vector<node> v;
	for(int i=1;i<=n;i++){
		int a,b,c,d;
		cin>>a>>b>>c>>d;
		v.push_back(node(a,b,c,d,i));
	}
	while(m--){
		int x,y;
		bool flag = false;
		cin>>x>>y;
		for(auto it = v.end()-1;it>=v.begin();it--){
			if(x>=it->x1&&x<=it->x2&&y>=it->y1&&y<=it->y2){ //判断点击坐标是否在此窗口内
				cout<<it->rank<<endl;
				flag = true;
				node top = *it;
				v.erase(it);
				v.push_back(top);
				break;
			}
		}
		if(!flag) cout<<"IGNORED"<<endl;
	}
	return 0;
}
Publicados 111 artículos originales · ganado elogios 2 · Vistas 3533

Supongo que te gusta

Origin blog.csdn.net/m0_38088647/article/details/100524341
Recomendado
Clasificación