Para resolver este problema, podemos utilizar una simulación directa.
El enfoque presentado aquí, aunque más detallado que otras soluciones, tiene una lógica simple y es fácil de comprender.
Utilizaremos una estructura de datos para almacenar las caras adyacentes de cada cubo.
char cubo1[7], cubo2[7];
struct Cara{
char valor;
char adyacentes[5];
}cara1[7], cara2[7];
cara1[1].valor = cubo1[1];
cara1[1].adyacentes[1] = cubo1[2];
cara1[1].adyacentes[2] = cubo1[3];
cara1[1].adyacentes[3] = cubo1[4];
cara1[1].adyacentes[4] = cubo1[5];
cara1[2].valor = cubo1[2];
cara1[2].adyacentes[1] = cubo1[1];
cara1[2].adyacentes[2] = cubo1[3];
cara1[2].adyacentes[3] = cubo1[4];
cara1[2].adyacentes[4] = cubo1[6];
... (omitiendo 9 líneas para el segundo array)
El proceso consiste en:
- Ordenar las caras adyacentes de cada cara
- Ordenar todas las caras
- Comparar ambas estructuras
Es importante recordar que UVA requiere manejo de múltiples casos de prueba.
Código completo aceptado:
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
char cuboA[7], cuboB[7];
struct Cara{
char valor;
char adyacentes[5];
}caraA[7], caraB[7];
void inicializar() {
for(int i = 1; i <= 6; i++) {
cuboA[i] = ' ';
cuboB[i] = ' ';
for(int j = 1; j <= 4; j++) {
caraA[i].adyacentes[j] = ' ';
caraB[i].adyacentes[j] = ' ';
}
}
}
bool compararCaras(const Cara& x, const Cara& y) {
if(x.valor == y.valor) {
for(int i = 1; i <= 4; i++) {
if(x.adyacentes[i] != y.adyacentes[i])
return x.adyacentes[i] < y.adyacentes[i];
}
}
return x.valor < y.valor;
}
bool verificarIguales() {
// Configurar caras del primer cubo
caraA[1].valor = cuboA[1];
caraA[1].adyacentes[1] = cuboA[2];
caraA[1].adyacentes[2] = cuboA[3];
caraA[1].adyacentes[3] = cuboA[4];
caraA[1].adyacentes[4] = cuboA[5];
caraA[2].valor = cuboA[2];
caraA[2].adyacentes[1] = cuboA[1];
caraA[2].adyacentes[2] = cuboA[3];
caraA[2].adyacentes[3] = cuboA[4];
caraA[2].adyacentes[4] = cuboA[6];
caraA[3].valor = cuboA[3];
caraA[3].adyacentes[1] = cuboA[1];
caraA[3].adyacentes[2] = cuboA[2];
caraA[3].adyacentes[3] = cuboA[5];
caraA[3].adyacentes[4] = cuboA[6];
caraA[4].valor = cuboA[4];
caraA[4].adyacentes[1] = cuboA[1];
caraA[4].adyacentes[2] = cuboA[2];
caraA[4].adyacentes[3] = cuboA[5];
caraA[4].adyacentes[4] = cuboA[6];
caraA[5].valor = cuboA[5];
caraA[5].adyacentes[1] = cuboA[1];
caraA[5].adyacentes[2] = cuboA[3];
caraA[5].adyacentes[3] = cuboA[4];
caraA[5].adyacentes[4] = cuboA[6];
caraA[6].valor = cuboA[6];
caraA[6].adyacentes[1] = cuboA[2];
caraA[6].adyacentes[2] = cuboA[3];
caraA[6].adyacentes[3] = cuboA[4];
caraA[6].adyacentes[4] = cuboA[5];
// Configurar caras del segundo cubo
caraB[1].valor = cuboB[1];
caraB[1].adyacentes[1] = cuboB[2];
caraB[1].adyacentes[2] = cuboB[3];
caraB[1].adyacentes[3] = cuboB[4];
caraB[1].adyacentes[4] = cuboB[5];
caraB[2].valor = cuboB[2];
caraB[2].adyacentes[1] = cuboB[1];
caraB[2].adyacentes[2] = cuboB[3];
caraB[2].adyacentes[3] = cuboB[4];
caraB[2].adyacentes[4] = cuboB[6];
caraB[3].valor = cuboB[3];
caraB[3].adyacentes[1] = cuboB[1];
caraB[3].adyacentes[2] = cuboB[2];
caraB[3].adyacentes[3] = cuboB[5];
caraB[3].adyacentes[4] = cuboB[6];
caraB[4].valor = cuboB[4];
caraB[4].adyacentes[1] = cuboB[1];
caraB[4].adyacentes[2] = cuboB[2];
caraB[4].adyacentes[3] = cuboB[5];
caraB[4].adyacentes[4] = cuboB[6];
caraB[5].valor = cuboB[5];
caraB[5].adyacentes[1] = cuboB[1];
caraB[5].adyacentes[2] = cuboB[3];
caraB[5].adyacentes[3] = cuboB[4];
caraB[5].adyacentes[4] = cuboB[6];
caraB[6].valor = cuboB[6];
caraB[6].adyacentes[1] = cuboB[2];
caraB[6].adyacentes[2] = cuboB[3];
caraB[6].adyacentes[3] = cuboB[4];
caraB[6].adyacentes[4] = cuboB[5];
// Ordenar adyacentes y caras
for(int i = 1; i <= 6; i++) {
sort(caraA[i].adyacentes + 1, caraA[i].adyacentes + 5);
sort(caraB[i].adyacentes + 1, caraB[i].adyacentes + 5);
}
sort(caraA + 1, caraA + 7, compararCaras);
sort(caraB + 1, caraB + 7, compararCaras);
// Comparar ambas estructuras
for(int i = 1; i <= 6; i++) {
if(caraA[i].valor != caraB[i].valor)
return false;
for(int j = 1; j <= 4; j++) {
if(caraA[i].adyacentes[j] != caraB[i].adyacentes[j])
return false;
}
}
return true;
}
int main() {
string entrada;
while(cin >> entrada) {
inicializar();
// Extraer configuración del primer cubo
for(int i = 0; i <= 5; i++)
cuboA[i + 1] = entrada[i];
// Extraer configuración del segundo cubo
for(int i = 6; i <= 11; i++)
cuboB[i - 5] = entrada[i];
if(verificarIguales())
cout << "TRUE" << endl;
else
cout << "FALSE" << endl;
}
return 0;
}