1395: Diapositivas molestas

1395: Diapositivas molestas
Límite de tiempo: 1000 ms Límite de memoria: 65536 KB
[Título Descripción]
El profesor Li dará un discurso muy importante esta tarde. Desafortunadamente, no es una persona muy ordenada y amontonó al azar las diapositivas que iba a usar para su presentación. Por lo tanto, tuvo que organizar estas diapositivas antes del discurso. Como un erudito eficiente, quería que hacerlo fuera lo más fácil posible. El profesor utilizará un total de n diapositivas (n<=26) para este discurso, y estas n diapositivas se han numerado con los números 1~n según el orden en que se utilizarán en el discurso. Debido a que las diapositivas son transparentes, no podemos ver a qué diapositiva corresponde cada número a la vez.
Ahora volvamos a numerar las diapositivas secuencialmente con letras mayúsculas A, B, C... otra vez. Tu tarea es escribir un programa para hacer coincidir los números y letras de las diapositivas, obviamente esta correspondencia debe ser única, si hay varias correspondencias o algunos números y letras no coinciden, diremos que dicha correspondencia es imposible de lograr.
[Entrada]
La primera línea solo tiene un número entero n, lo que indica que hay n diapositivas, y cada una de las siguientes n líneas incluye 4 números enteros xmin, xmax, ymin, ymax (los números enteros están separados por espacios) como las coordenadas de las diapositivas Las n diapositivas están numeradas A, B, C... de adelante hacia atrás según el orden en que aparecen en el archivo, y las siguientes n líneas son las coordenadas x, y de n números a su vez, obviamente entre las diapositivas No habrá números afuera.
[Salida]
Si se puede realizar la correspondencia, el archivo de salida debe incluir n líneas, cada línea es una letra y un número, separados por un espacio, y cada línea está ordenada en orden ascendente de letras, tenga en cuenta que las letras de salida deben ser en mayúsculas y fijos; de lo contrario, si la correspondencia no se puede realizar, simplemente envíe Ninguno en la primera línea del archivo. No hay espacios adicionales al final de la primera línea.
[Ejemplo de entrada]
4
6 22 10 20
4 18 6
16 8 20 2 18
10 24 4 8 9
15
19
17 11 7
21 11
[Ejemplo de salida]
A 4
B 1
C 2
D 3

#include <bits/stdc++.h>
using namespace std;
int n;
struct nod{
	int x1, y1, x2, y2; // 节点结构体,记录框区间的坐标信息
} nods[30];
struct Slide{
	char c; // 存储字符编号
	int id; // 存储对应的数字编号
	bool operator<(const Slide a) const{
		return  c< a.c; // 用于排序的较运算符
	}
};
vector<int> v[30];    // 存储每个区间可能相交的点的编号
set<int> st[30];      // set 是为了方便删除,存储每个点可能属于的区间编号
vector<Slide> ans;    // 存储最终的结果
bool Solve(){
	queue<int> q;
	for(int i = 1;i <= n; i++)
		if(st[i].size() == 1) q.push(i); // 将只有一个相邻节点的点入队
	while(!q.empty()){
		int t = q.front(); // 当前节点
		q.pop();
		int u = *st[t].begin(); // 相邻节点
		st[t].clear(); // 清除当前节点的相邻节点集合
		ans.push_back({u + 'A' - 1, t}); // 添加当前节点和相邻节点到结果中
		for(auto it : v[u]){
			st[it].erase(u); // 删除相邻节点的连接
			if(st[it].size() == 1) q.push(it); // 如果相邻节点只有一个连接,将其入队
		}
	}
	return (ans.size() == n); // 判断是否找到了符合条件的解
}
int main()
{	
	cin >> n; // 输入区间数量
	for(int i = 1; i <= n; i++)
		cin >> nods[i].x1 >> nods[i].x2 >> nods[i].y1 >> nods[i].y2; // 输入每个区间的坐标信息
	for(int i = 1, x, y; i <= n; i++){
		cin >> x >> y; // 输入坐标
		for(int j = 1; j <= n; j++){
			if(x >= nods[j].x1 && x <= nods[j].x2 && y >= nods[j].y1 && y <= nods[j].y2){
				v[j].push_back(i); // 将点与区间进行连接
				st[i].insert(j); // 记录点与相邻区间的关系
			}
		}
	}
	if(Solve()){ // 如果有解
		sort(ans.begin(), ans.end()); // 对结果进行排序
		for(auto a : ans)
			cout << a.c << " " << a.id << endl; // 输出结果
	}
	else 
		cout << "None"; // 没有找到符合条件的解
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/lybc2019/article/details/128442603
Recomendado
Clasificación