Solución al Problema UVA253: Pintura de Cubos

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:

  1. Ordenar las caras adyacentes de cada cara
  2. Ordenar todas las caras
  3. 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;
}

Etiquetas: programación algoritmos cubos UVA estructuras de datos

Publicado el 6-12 18:04