Tenemos un conjunto de casas situadas a lo largo de una carretera, en posiciones enteras (que son como la distancia desde el inicio de la carretera hasta la casa). Un pueblo es una subsecuencia máxima de 2 casas o más, consecutivas en la carretera, que están a menos de 3 unidades de distancia entre sí. Por esta definición, los pueblos no se pueden solapar entre sí. (A veces también hay casas solas, porque están a una distancia de 3 o más de sus casas vecinas).
Por ejemplo, consideremos las siguientes casas en la carretera:
| Nombre | Can_Sola |
Can_Verdet |
Cal_Quer |
Ca_n_Aurelia |
Can_Roca |
| Posición | 0 |
1 |
4 |
8 |
10 |
En este caso, hay 2 pueblos: Can_Sola y
Can_Verdet por un lado; y Ca\_n\_Aurelia y
Can_Roca por el otro. Cal_Quer no forma parte
de ningún pueblo.
Debes hacer una función detecta_pobles
con la siguiente declaración:
struct Casa {
string nom;
int pos;
};
struct Poble {
int inici, fi;
int num_cases;
};
/**
* @brief Detecta los pueblos de la carretera.
*
* @pre El vector `cases` está ordenado por nombre.
* @post El resultado está ordenado por posición.
*/
vector<Poble> detecta_pobles(vector<Casa>& cases);
El vector cases contiene las casas, pero éstas vienen
ordenadas por nombre. El resultado debe ser un vector de
pueblos (vector<Poble>), con todos los pueblos
(usando la definición) en el orden en que se encuentran en la carretera
(es decir, ordenados por posición).
El icono de nombre ’.CPP’ contiene el programa principal para hacer las pruebas.
Sólo debes enviar un fichero que contenga la función requerida, con
los include necesarios y las funciones auxiliares que hayas
declarado (si hay), y nada más.
No se puede usar la función sort de C++. Si
quieres ordenar un vector, debes implementarlo la ordenación tú (puedes
usar cualquier algoritmo).
Para poder poner las estructuras en la solución, hace falta copiar y
pegar el siguiente código (que evita que salga un error que dice que la
declaración de Casa y Poble está
duplicada):
#ifndef TIPUS
#define TIPUS
struct Casa {
string nom;
int pos;
};
struct Poble {
int inici, fi;
int num_cases;
};
#endif
Este código también se encuentra en el fichero main.cc
que te damos.
La entrada ya la procesa el programa principal que se da (icono .CPP). La entrada consiste en varias secuencias de casas, en donde cada una empieza con un entero que indica cuántas casas hay en la carretera, y después siguen las casas ordenadas por nombre.
La salida ya la produce el programa principal que se da (icono .CPP). Para cada secuencia de casas, se muestran los pueblos detectados, cada uno con la posición inicial, la final, y el número de casas.
Input
10 Ca_n_Aurelia 8 Cal_Mestre 14 Cal_Quer 7 Can_Pla 13 Can_Roca 20 Can_Sola 0 Can_Torrent 3 Can_Verdet 2 Can_Vila 25 Can_Xic 30
Output
___ 0 3 3 7 8 2 13 14 2