PI-ITBA / 2024_01

8 stars 0 forks source link

TP06_20 #53

Closed dalilaorbaj closed 3 months ago

dalilaorbaj commented 6 months ago

No logro encontrar el error en el siguiente codigo y de paso me quedo la duda de si se podria hacer una funcion mas general para evaluar fila o columna, o bien ambas al mismo tiempo aprovechando iteraciones?

#include <stdio.h>
#include <assert.h>

#define DIM 9

int sudokuSolver(char m[][DIM]);
int submatriz(char m[][DIM], int submatriz);
int fila(char m[][DIM], int fila);
int columna(char m[][DIM], int col);

int main(void) {
  char sudoku[DIM][DIM] = {{0}};
  assert(sudokuSolver(sudoku)==0);
  char sudoku2[DIM][DIM] = {
        {3,8,1,9,7,6,5,4,2}, 
        {2,4,7,5,3,8,1,9,6},
        {5,6,9,2,1,4,8,7,3},
        {6,7,4,8,5,2,3,1,9},
        {1,3,5,7,4,9,6,2,8},
        {9,2,8,1,6,3,7,5,4},
        {4,1,2,6,8,5,9,3,7},
        {7,9,6,3,2,1,4,8,5},
        {8,5,3,4,9,7,2,6,1}
  };

  assert(sudokuSolver(sudoku2)==1);

  char sudoku3[DIM][DIM] = {
        {2,8,1,9,7,6,5,4,2}, 
        {3,4,7,5,3,8,1,9,6},
        {5,6,9,2,1,4,8,7,3},
        {6,7,4,8,5,2,3,1,9},
        {1,3,5,7,4,9,6,2,8},
        {9,2,8,1,6,3,7,5,4},
        {4,1,2,6,8,5,9,3,7},
        {7,9,6,3,2,1,4,8,5},
        {8,5,3,4,9,7,2,6,1}
  };

  assert(sudokuSolver(sudoku3)==0);

  // Cuando se tomó este ejercicio en un parcial, en una de las respuestas
  // sólo chequeaban que la suma de cada fila, columna y cuadrado fuera 45
  char sudoku4[DIM][DIM] = {
        {5,5,5,5,5,5,5,5,5}, 
        {5,5,5,5,5,5,5,5,5}, 
        {5,5,5,5,5,5,5,5,5}, 
        {5,5,5,5,5,5,5,5,5}, 
        {5,5,5,5,5,5,5,5,5}, 
        {5,5,5,5,5,5,5,5,5}, 
        {5,5,5,5,5,5,5,5,5}, 
        {5,5,5,5,5,5,5,5,5}, 
        {5,5,5,5,5,5,5,5,5}
  };

  assert(sudokuSolver(sudoku4)==0);

  char sudoku5[DIM][DIM] = {
        {3,8,1,9,7,6,5,4,12}, 
        {2,4,7,5,3,8,1,9,6},
        {5,6,9,2,1,4,8,7,3},
        {6,7,4,8,5,2,3,1,9},
        {1,3,5,7,4,9,6,2,8},
        {9,2,8,1,6,3,7,5,4},
        {4,1,2,6,8,5,9,3,7},
        {7,9,6,3,2,1,4,8,5},
        {8,5,3,4,9,7,2,6,1}
  };

  assert(sudokuSolver(sudoku5)==0);

  return 0;
}

int sudokuSolver(char m[][DIM]){
    int valido=1;
    for(int i=0 ; i<DIM && valido ; i++){
        if(!submatriz(m, i) || !fila(m, i) || !columna(m, i)){
            valido =0;
        }
        else{
            valido=1;
        }

    }
    return valido;
}

int columna(char m[][DIM], int col){ //Devuelvo 0 si la columna es invalida y 1 si es valida 
    int encontrado=1;

    for(int j=0, encontrado=1; j<DIM && encontrado ; j++, encontrado=0){
        for(int i=0, encontrado=0; i<DIM && !encontrado; i++){
            if(j==m[i][col]){
                encontrado=1;
            }else if(m[i][col]<1 || m[i][col]>9){
                return 0;
            }
        }
    }
    return encontrado;
}

int fila(char m[][DIM], int fila){ //Devuelvo 0 si la columna es invalida y 1 si es valida 
    int encontrado=1;

    for(int j=0; j<DIM && encontrado ; j++, encontrado=0){
        for(int i=0, encontrado=0; i<DIM && !encontrado; i++){
            if(j==m[fila][i]){
                encontrado=1;
            } else if(m[fila][i]<1 || m[fila][i]>9){
                return 0;
            }
        }
    }
    return encontrado;
}

int submatriz(char m[][DIM], int sub){
    int encontrado=1;
    int j=(sub%3)*3;
    int i = (sub-3 >= 3 ? 6 : (sub-3 <0 ? 0 : 3));
    int topej=j+3;
    int topei=i+3;
    for(int k=0; k<DIM && encontrado; k++){
        encontrado=0;
        for( ; i<topei && !encontrado ; i++){
            for( ; j<topej && !encontrado; j++){
                if(m[i][j] <0 || m[i][j]>9){
                    return 0;
                }
                if(j==m[i][j]){
                    encontrado=1;
                }
            }
            }
        }
        return encontrado;
    }
ImNotGone commented 6 months ago

el chequeo de submatriz, fila y columna son por separado si esa era tu duda, asi que estaria bien. En cuanto al checkeo de fila, podes mandar derecho mat[i] en vez de la matriz y pasa la fila entera (como si fuese un vector de 1x9) a la funcion si eso te es mas claro. Despues no termino de entender bien que estas queriendo hacer en las funciones que revisan filas y columnas. deberias hacer una pasada de 9 posiciones a lo largo o a lo ancho respectivamente y tenes 2 for loops. El error debe estar ahi. Si queres revisa eso y dsp lo reviso denuevo