1183 - Clock

Discussion around the problems of the COJ.
Forum rules
Remember that posting AC code is not allowed here. If you are going to ask a question or to post a solution, describe your algorithm instead. Posting AC code will be penalized.
Post Reply
User avatar
dovier
Posts: 1143
Joined: 8 years ago
Location: Havana, Cuba
Gender: Male
Cuba

1183 - Clock

Post by dovier » 8 years ago




User avatar
Jose132
Posts: 47
Joined: 5 years ago
Location: Matanzas - Cuba
Gender: None specified
Contact:

Re: 1183 - Clock

Post by Jose132 » 4 years ago

Mandé este ejercicio y me dio WA y no sé por qué, luego me di cuenta que no se especifica que siempre será posible obtener el número, mi duda es la siguiente, es posible que en algún momento entre un dato que es imposible que sea un número, algo como esto:
###
###
###
###
###
o que el resultado sea una hora imposible como 56:60. En estos casos que hay que imprimir? :?
Este es mi código, básicamente yo le paso los 4 arreglos de 5x3 y la función me saca los 4 dígitos para después imprimirlos.

Code: Select all

...
Last edited by Jose132 on Sat Dec 19, 2015 2:45 am, edited 1 time in total.
:-) "Behind every code is an enigma" :-)

User avatar
ymondelo20
Posts: 1968
Joined: 8 years ago
Location: Universidad de las Ciencias Informáticas
Gender: None specified
Contact:

Re: 1183 - Clock

Post by ymondelo20 » 4 years ago

NO habrán casos con soluciones imposibles. Ese es el punto.
Nota que el enunciado dice que algunos diodos se apagaron; solo eso.
"Every problem has a simple, fast and wrong solution" OJ's Main Law. ;)

User avatar
Jose132
Posts: 47
Joined: 5 years ago
Location: Matanzas - Cuba
Gender: None specified
Contact:

Re: 1183 - Clock

Post by Jose132 » 4 years ago

Por favor alguien pudiera decirme que tengo mal en este codigo? :?

Code: Select all

#include <iostream>
#include <stdio.h>

using namespace std;

struct num{
    string led[5];
};

num nums[ 10 ];

void preprocesar(){
    nums[ 0 ].led[ 0 ] = nums[ 0 ].led[ 4 ] = nums[ 2 ].led[ 0 ] = nums[ 2 ].led[ 2 ] = nums[ 2 ].led[ 4 ] = nums[ 3 ].led[ 0 ] = nums[ 3 ].led[ 2 ] = nums[ 3 ].led[ 4 ] = nums[ 4 ].led[ 2 ] = nums[ 5 ].led[ 0 ] = nums[ 5 ].led[ 2 ] = nums[ 5 ].led[ 4 ] = nums[ 6 ].led[ 0 ] = nums[ 6 ].led[ 2 ] = nums[ 6 ].led[ 4 ] = nums[ 7 ].led[ 0 ] = nums[ 8 ].led[ 0 ] = nums[ 8 ].led[ 2 ] = nums[ 8 ].led[ 4 ] = nums[ 9 ].led[ 0 ] = nums[ 9 ].led[ 2 ] = nums[ 9 ].led[ 4 ] = "###";
    nums[ 0 ].led[ 1 ] = nums[ 0 ].led[ 2 ] = nums[ 0 ].led[ 3 ] = nums[ 4 ].led[ 0 ] = nums[ 4 ].led[ 1 ] = nums[ 6 ].led[ 3 ] = nums[ 8 ].led[ 1 ] = nums[ 8 ].led[ 3 ] = nums[ 9 ].led[ 1 ] = "#.#";
    nums[ 1 ].led[ 0 ] = nums[ 1 ].led[ 1 ] = nums[ 1 ].led[ 2 ] = nums[ 1 ].led[ 3 ] = nums[ 1 ].led[ 4 ] = nums[ 2 ].led[ 1 ] = nums[ 3 ].led[ 1 ] = nums[ 3 ].led[ 3 ] = nums[ 4 ].led[ 3 ] = nums[ 4 ].led[ 4 ] = nums[ 5 ].led[ 3 ] = nums[ 7 ].led[ 1 ] = nums[ 7 ].led[ 2 ] = nums[ 7 ].led[ 3 ] = nums[ 7 ].led[ 4 ] = nums[ 9 ].led[ 3 ] = "..#";
    nums[ 2 ].led[ 3 ] = nums[ 5 ].led[ 1 ] = nums[ 6 ].led[ 1 ] = "#..";
    nums[ 4 ].led[ 0 ] = nums[ 4 ].led[ 1 ] = nums[ 6 ].led[ 3 ] = nums[ 8 ].led[ 1 ] = nums[ 8 ].led[ 3 ] = nums[ 9 ].led[ 1 ] = "#.#";
}

void check(num a){
    bool ok;
    for(int k = 0 ; k < 10 ; k++){
        ok = true;
        for(int i = 0 ; i < 5 ; i++){
            for(int j = 0 ; j < 3 ; j++){
                if(a.led[ i ][ j ] == '#' && nums[ k ].led[ i ][ j ] == '.'){
                    ok = false;
                    break;
                }
            }
            if(!ok)
                break;
        }
        if(ok){
            printf("%d", k);
            return;
        }
    }
}

int main()
{
    preprocesar();
    num a, b, c, d;
    char aux[5];
    int t;
    scanf("%d", &t);
    while(t--){
        for(int i = 0 ; i < 5 ; i++){
            scanf("%s", aux);
            a.led[ i ] = aux;
            scanf("%s", aux);
            b.led[ i ] = aux;
            scanf("%s", aux);
            c.led[ i ] = aux;
            scanf("%s", aux);
            d.led[ i ] = aux;
        }
        check(a);
        check(b);
        printf(":");
        check(c);
        check(d);
        if(t != 0)
            printf(" ");
    }
    printf("\n");
    return 0;
}
:-) "Behind every code is an enigma" :-)

User avatar
isaac
Posts: 83
Joined: 4 years ago
Gender: None specified

Re: 1183 - Clock

Post by isaac » 4 years ago

Mi hermano, ese codigo esta demasiado engorroso. Una de las formas que lo puedes hacer un poco mas simple es formar 10 cadenas con la representacion de cada digito, algo asi:

Code: Select all

"####.##.##.####"
"..#..#..#..#..#"
"###..#####..###"
"###..####..####"
"#.##.####..#..#"
"####..###..####"
"####..####.####"
"###..#..#..#..#"
"####.#####.####"
"####.####..####"
Nota que si cada cadena la divides en subcadenas de 3 caracteres y luego las pones una debajo de la otra, se ven los digitos que representan. Ej:

5 -> ### #.. ### ..# ###

###
#..
###
..#
###

Lo unico que hay que hacer es leer la entrada, convertirla a esa forma y luego ir desde 0 hasta 9 viendo si cada uno de los leds encendidos en el digito de la entrada, estan tambien encendidos en la representacion del digito analizado. Como se pide la menor ora posible, la solucion seria un greedy.

User avatar
Jose132
Posts: 47
Joined: 5 years ago
Location: Matanzas - Cuba
Gender: None specified
Contact:

Re: 1183 - Clock

Post by Jose132 » 4 years ago

@isaac Gracias por ayudarme, pero me sigue dando WA con lo que me dijiste, este es mi codigo ahora:

Code: Select all

#include <iostream>
#include <stdio.h>

using namespace std;

string nums[] = {"####.##.##.####", "..#..#..#..#..#", "###..#####..###", "###..####..####", "#.##.####..#..#", "####..###..####", "####..####.####", "###..#..#..#..#", "####.#####.####", "####.####..####"};
string h1, h2, h3, h4;

bool check(int j, string b){
    for(int i = 0 ; i < 15 ; i++)
        if(nums[ j ][ i ] == '.' && b[ i ] == '#')
            return false;
    return true;
}

void solve(){
    for(int i = 0 ; i < 10 ; i++)
        if(check(i, h1)){
            printf("%d", i);
            break;
        }
    for(int i = 0 ; i < 10 ; i++)
        if(check(i, h2)){
            printf("%d", i);
            break;
        }
    printf(":");
    for(int i = 0 ; i < 10 ; i++)
        if(check(i, h3)){
            printf("%d", i);
            break;
        }
    for(int i = 0 ; i < 10 ; i++)
        if(check(i, h4)){
            printf("%d", i);
            break;
        }
}

int main()
{
    char aux[ 5 ];
    int t;
    scanf("%d", &t);
    while(t--){
        h1 = h2 = h3 = h4 = "";
        for(int i = 0 ; i < 5 ; i++){
            scanf("%s", aux);
            h1 += aux;
            scanf("%s", aux);
            h2 += aux;
            scanf("%s", aux);
            h3 += aux;
            scanf("%s", aux);
            h4 += aux;
        }
        solve();
        if(t)
            printf(" ");
    }
    return 0;
}
Pudieras ayudarme nuevamente?
:-) "Behind every code is an enigma" :-)

User avatar
isaac
Posts: 83
Joined: 4 years ago
Gender: None specified

Re: 1183 - Clock

Post by isaac » 4 years ago

No se dónde está el error porque al parecer la solución es la correcta pero lo que dice el juez es otra cosa. De todas formas yo lo hice un poco diferente en cuanto a la hora de chequear la hora. Voy a examinar mejor tu código a ver que encuentro.

Post Reply

Return to “Problem set”