Historias
Slashboxes
Comentarios
 
Este hilo ha sido archivado. No pueden publicarse nuevos comentarios.
Mostrar opciones Umbral:
Y recuerda: Los comentarios que siguen pertenecen a las personas que los han enviado. No somos responsables de los mismos.
  • Yo lo hice en C

    (Puntos:2)
    por azaras (16275) el Martes, 12 Septiembre de 2006, 09:43h (#810481)
    ( Última bitácora: Miércoles, 10 Marzo de 2010, 15:16h )
    De forma chapucilla y me llevó más o menos las mismas lineas.

    Claro que no usé técnicas tan sofisticadas. El mio prueba todas las posibilidades de manera recursiva. Es un ejemplo de recursividad típico.

    --
    omnia sunt communia
  • Aquí el código:

    (Puntos:2)
    por azaras (16275) el Martes, 12 Septiembre de 2006, 09:47h (#810485)
    ( Última bitácora: Miércoles, 10 Marzo de 2010, 15:16h )
    #include <stdio.h>
    //#define UNA_SOLUCION
    int numero_sol;

    mostrar (int m[9][9])
    {
    int i, j;
    for (i = 0 ; i < 9 ; i++) {
    for (j = 0 ; j < 9 ; j++)
    printf ("%i ", m[i][j]);
    printf("\n");
    }
    }

    int ok (int m[9][9], int i, int j)
    {
    int k,k1,n;
    int r_i, r_j;
    int v_i, v_j;
    n = m[i][j];
    /* está en fila o columna? */
    for (k=0;k<9;k++){
    if ((j!=k) && (m[i][k] == n))
    return 0;
    if ((i!=k) && (m[k][j] == n))
    return 0;
    }

    /* esta en cuadrado? */
    r_i = i % 3;
    r_j = j % 3;
    v_i = i / 3;
    v_j = j / 3;
    for (k = 0; k < 3; k++)
    for (k1 = 0; k1 < 3; k1++){
    if ((m[(v_i*3) + k][(v_j*3) + k1] == n)
    && (!((r_i == k) && (r_j == k1))))
    return 0;
    }
    return 1;
    }

    int completa (int m[9][9], int i, int j, int z)
    {
    int k,z2;
    if (m[i][j] != 0) { /* es un número */
    if (ok(m, i, j)) {
    if ((i == 8) && (j == 8)){
    printf ("Solución n: %i:\n\n", ++numero_sol);
    mostrar(m);
    #ifdef UNA_SOLUCION
    return 1;
    #endif
    #ifndef UNA_SOLUCION
    return 0;
    #endif
    }
    else{

    if (j==8){
    if (m[i+1][0]==0)
    z2=1;
    else
    z2=0;
    if (completa(m, i+1, 0, z2))
    return 1;
    return 0;
    }
    else{
    if (m[i][j+1]==0)
    z2=1;
    else
    z2=0;
    if (completa(m, i, j+1, z2))
    return 1;
    return 0;
    }
    //if (z==1) SUPERFLUO SUPONGO
    //m[i][j]=0;
    --
    omnia sunt communia
    [ Padre ]