Sudoku c++ como verificar si hay numeros repetidos en un array o un array multidimensional

publicado por: Anonymous

Lo único que tengo que hacer es agarrar un sudoku resuelto y verificar si el sudoku resuelto esta correcto.

Lo que no sé, es si hacer un array de “int sudoku[9][9]” o hacer un array por cada fila y columna

soy nuevo en c++

using namespace std;
int sudoku[9][9] =
{
{5,3,4,6,7,8,9,1,2},
{6,7,2,1,9,5,3,4,8},
{1,9,8,3,4,2,5,6,7},
{8,5,9,7,6,1,4,2,3},
{4,2,6,8,5,3,7,9,1},
{7,1,3,9,2,4,8,5,6},
{9,6,1,5,3,7,2,8,4},
{2,8,7,4,1,9,6,3,5},
{3,4,5,2,8,6,1,7,9}
};
}

solución

Reglas del SUDOKU:

  1. Solo numeros 1 al 9,
  2. No repeticiones en misma fila,
  3. No repeticiones en la misma columna,
  4. No repeticiones en la misma región (9 submatrices de 3 x 3).

:

/* Leer sudoku, 
    como vamos a leer digitos (1-9), los leemos de caracter en caracter.
    Para convertirlos de Ascii a entero, simplemente restamos el Ascii del '0'
    Si nos dan algo que no sea dígito, simplemente no será contado abajo.
*/
for(i=0;i<9;i++)
    for(j=0;j<9;j++)
    {
        scanf("%c",&c);
        a[i][j]=c-'0';
    }

/* Valida filas
    Revisamos cara campo del arreglo y guardamos cuales digitos ya
    encontramos, activando el bit correspondiente en una bandera de bits.
    Solo usaremos 9 de los 32 bits, así que si están los 9 digitos, la
    bandera tendrá el valor 0x01ff. Usaremos este valor para comparar.
*/
for(i=0;i<9;i++)
{
    flag=0x0000;
    for(j=0;j<9;j++)
        flag|=1<<(a[i][j]-1);
    if(flag!=0x01FF)
        reporta("fila",i,j-1);
}

/* Valida columnas
    Hacemos lo mismo que en las filas, haciendo el recorrido ahora 
    de forma "vertical"
*/
for(j=0;j<9;j++)
{
    flag=0x0000;
    for(i=0;i<9;i++)
        flag|=1<<(a[i][j]-1);
    if(flag!=0x01FF)
    reporta("col",i-1,j);
}

/* Valida bloques (3x3)
    Hacemos lo mismo que en las filas, pero en bloques de 3x3.
*/
for(si=0;si<3;si++)
{
    for(sj=0;sj<3;sj++)
    {
        flag=0x0000;
        for(i=0;i<3;i++)
        {
            for(j=0;j<3;j++)
                flag|=1<<(a[si*3+i][sj*3+j]-1);

        }
        if(flag!=0x01FF)
            reporta("bloque",si*3+i-1,sj*3+j-1);
    }
}
printf("nEl sudoku es correcto");

Esta solución no es propia, fue traducida del ingles, puedes verla aquí

Respondido por: Anonymous

Leave a Reply

Your email address will not be published.