PI-ITBA / 2024_02

Consultas 2C 2024
4 stars 0 forks source link

TP6 ej20 #63

Open IgnacioAnd opened 1 month ago

IgnacioAnd commented 1 month ago

Buenos días, me gustaría saber si el código es correcto.

int verificaFila(char v[]){
int aux[DIM] = {0};
    for (int i = 0; i<DIM; i++){
        if (v[i] >= 1 && v[i] <= 9 && aux[v[i]-1] == 0){
            aux[v[i]-1]++;
        }else {
            return 1;
        }
    } 
    return 0;
}

int verificaCol(char m[][DIM], int col){
int aux[DIM] = {0};
    for (int i = 0; i<DIM; i++){
        if (aux[m[i][col]-1] == 0){
            aux[m[i][col]-1]++;
        }else {
            return 1;
        }
    }
    return 0;
}

int verificaCuadro(char m[][DIM], int fil, int col){
int aux[DIM] = {0};
    for (int i = fil; i<fil+3; i++){
        for (int j = col; j<col+3; j++){
            if (aux[m[i][j]-1] == 0){
                aux[m[i][j]-1]++; 
            }else {
                return 1;
            }
        }
    }
    return 0;
}

int sudokuSolver(char m[][DIM]){
int num;
    for (int i = 0; i<DIM; i++){
        if ((i%3) == 0){
            num = i;
        }else if (verificaFila(m[i])){
            return 0;
        }else if (verificaCol(m,i)){
            return 0;
        }else if (verificaCuadro(m, num, (i%3)*3)){
            return 0;
        }
    }
    return 1;
}
ImNotGone commented 1 month ago

si das vuelta algunos de tus ifs te queda menos indentado. mas facil de leer, nota que si tengo un return en un if no hace falta poner el else en vez de

        if (aux[m[i][col]-1] == 0){
            aux[m[i][col]-1]++;
        }else {
            return 1;
        }

podes hacer

        if (aux[m[i][col]-1] != 0){
            return 0;
        }
        aux[m[i][col]-1]++;

Este patron se repite varias veces

ImNotGone commented 1 month ago

Aca tenes un error. si entra al primer if no revisa ni esa fila ni esa columna ni ese cuadro -> para i = 0, 3 o 6 no verifica

int sudokuSolver(char m[][DIM]){
int num;
    for (int i = 0; i<DIM; i++){
        if ((i%3) == 0){
            num = i;
        }else if (verificaFila(m[i])){
            return 0;
        }else if (verificaCol(m,i)){
            return 0;
        }else if (verificaCuadro(m, num, (i%3)*3)){
            return 0;
        }
    }
    return 1;
}
IgnacioAnd commented 1 month ago

Lo de modificar los primeros ifs lo habia intentado y me daba error. Pero no entendi lo ultimo.

IgnacioAnd commented 1 month ago

Con ese primer if lo unico que hago es tener bien los numeros para la funcion verificaCuadro. Porque necesito que sea 0, 3 o 6

ImNotGone commented 1 month ago

si entra al if, no entra a los else....

ImNotGone commented 1 month ago

ademas seria mas logico que las funciones de verificacion retornen 0 en caso de fallo y 1 en caso de exito

ImNotGone commented 1 month ago

lo que queres hacer es esto entonces?

int sudokuSolver(char m[][DIM]){
    int num;
    for (int i = 0; i<DIM; i++){
        if (verificaFila(m[i]) || verificaCol(m,i) || verificaCuadro(m, i%3, (i%3)*3)){
            return 0;
        }
    }
    return 1;
}
IgnacioAnd commented 1 month ago

Ok ya entendi Tengo que sacar los else de esa funcion entonces, solo los dejo con ifs. Y lo de que retorne 0 si falla y 1 si no, no es lo mismo?

ImNotGone commented 1 month ago

Lo del return si, son convenciones. Para que sea mas facil de leer seria esperable que se comporte segun la convencion. Despues ademas en todos los if retornabas 0. Si comparten comportamiento, porque no unir la condicion para no tener 3 return

IgnacioAnd commented 1 month ago

No porque esto lo que hace es que a la funcion verifica cuadro le pasa 0, 1 o2. y yo necesito 0, 3 o 6.

int sudokuSolver(char m[][DIM]){
    int num;
    for (int i = 0; i<DIM; i++){
        if (verificaFila(m[i]) || verificaCol(m,i) || verificaCuadro(m, i%3, (i%3)*3)){
            return 0;
        }
    }
    return 1;
}
IgnacioAnd commented 1 month ago

Dale uno los 3 ifs, pero el primero tiene que quedar igual. Porque asi puedo pasar los parametros 0, 3 y 6

ImNotGone commented 1 month ago

Te lo pase mal antes, hacelo asi:

int sudokuSolver(char m[][DIM]){
    int num;
    for (int i = 0; i<DIM; i++){
        if (verificaFila(m[i]) || verificaCol(m,i) || verificaCuadro(m, (i/3) * 3, (i%3)*3)){
            return 0;
        }
    }
    return 1;
}
IgnacioAnd commented 1 month ago

Ahi lo pruebo

IgnacioAnd commented 1 month ago

Funciono Perfecto Gracias

ImNotGone commented 1 month ago

:D