Ver Mensaje Individual
  #9 (permalink)  
Antiguo 05/12/2014, 03:54
Avatar de leosansan
leosansan
 
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años, 5 meses
Puntos: 49
Respuesta: Sudoku en borland c++

Por cierto, fíjate que la función estrella" apenas es de 50 líneas, lo demás es imprimir y otras lindeces para hacer la salida más interesante.

Código C++:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <windows.h>
  5. /** 1 < fil < 6 ....1 < col < 6 ..ej: 2x3, 2x4, 3x2, 3x3, 3x5, 5x3, 4x3, 3x4, 4x4, 4x5, 4x6....¡¡¡..NO 5 x 5 ¡¡¡ ***/
  6. #define fil  3u
  7. #define col  3u /** NO 5 x 5 **/
  8. #define tamXY  ( fil * col )
  9. #define tamX  ( fil * fil )
  10. #define tamY  ( fil * col )
  11. #define tam  ( fil * col )
  12. #define Tam  ( tamX * tam )
  13.  
  14. void generarSudoku ( void ) ;
  15. void generarNumAleatorio ( unsigned int TAM , unsigned int algO [ TAM ] ) ;
  16. void imprimir ( unsigned int algo [ tam ][ tam ] , unsigned int flag ) ;
  17. void espaciado ( )  ;
  18. int gotoxy ( int x , int y ) ;
  19.  
  20. int  main ( void ) {
  21.   srand ( ( unsigned ) time ( NULL ) ) ;
  22.   generarSudoku ( ) ;
  23.   return 0 ;
  24. }
  25.  
  26. void generarSudoku ( void ) {
  27.   unsigned int  i  , j , k  , tamx , cont , contTotal , q , salto , saltoFil , aleatorio , num [ tam ][ tam ] , numAleat [ tam ] ;
  28.   unsigned int  icont = 2500 , icontTotal = 1000000 ,/*10000000*/ ocupados  [ 2 ][ fil  ][ tam ][ tam ] ;
  29.   //unsigned int icont [ ]= {2500,25000,250000,250000,2500000,2500000}, icontTotal [ ] = {10000000, 50000000, 100000000, 500000000, 1000000000, 100000000} ;
  30.   static unsigned int reinicios = 0 , reinicio [ 6 ] ;
  31.   tamx = ( fil < col ) ? tamX : tam ;
  32.   for ( i = 0 ; i < tamx ; i ++ )  reinicio [ i ] = 0 ;
  33.   inicio1 :  /** <===  INICIO1 **/
  34.     for ( salto = 0 , contTotal = 0 ; salto < fil ; salto++ ) {
  35.     saltoFil = salto * fil - 1 ;
  36.     inicio :  /** <===  INICIO **/
  37.     for ( i = 0  ,cont = 0 ; i < tamx ; i ++ )
  38.       for ( j = 0 ; j < tam ; j++ ) {
  39.         if ( salto == 0 )
  40.           for ( k = 0 ; k < fil ; k ++ )
  41.             ocupados  [ 0 ][ k ][ i ][ j ] = ocupados [ 1 ][ k ][ i ][ j ] = 0 ;
  42.         else
  43.           ocupados [ 0 ][ salto ][ i ][ j ] = ocupados [ 0 ][ salto - 1 ][ i ][ j ] , ocupados [ 1 ][ salto ][ i ][ j ] = ocupados [ 1 ][ salto - 1 ][ i ][ j ] ;
  44.           if ( i >= salto * fil )
  45.             num [ i ][ j ] = 0 ;
  46.       }
  47.     generarNumAleatorio ( tam , numAleat ) ;
  48.     for ( i = salto * fil , q = 0;  i <  ( salto + 1 ) * fil ; i++ ) {
  49.       aleatorio = rand ( ) % tam ;
  50.       for ( j = q ; j < q + col ; j++ , aleatorio = rand ( ) % tam  ) {
  51.         while ( ocupados [ 0 ][ salto ][ i ][ numAleat [ aleatorio ] - 1 ] == 1 || ocupados [ 1 ][ salto ][ numAleat [ aleatorio ] - 1 ][ j ] == 1 || numAleat [ aleatorio  ] == 0  ) {
  52.           aleatorio = rand ( ) % tam , contTotal++ , cont++ ;
  53.           if ( cont > icont /*icont [ salto ]*/ )
  54.             { gotoxy ( 0 , 2 * tam + 16 ) ;
  55.             printf ( "SALTO::%u:: contador = %8u\tcontTotal = %10u\treinicios = %4u\treinicios [ %d ] = %4u\n" , salto , cont , contTotal , reinicios , salto , reinicio [ salto ] ) ;
  56.             //gotoxy(0,2*tam+20),imprimir(num,0); /** Activalo si lo quieres ver trabajando, pero en valores mayores ralentiza el resultado final **/
  57.             goto inicio ;}
  58.           if ( contTotal > icontTotal/* icontTotal [ salto ]*/ )
  59.             { gotoxy ( 0 , 2 * tam + 17 ) ; reinicio [ salto ]++ ; reinicios++ ; printf ( "SALTO::%u:: contador = %8u\tcontTotal = %10u\treinicios = %4u\treinicios [ %d ] = %4u\n" , salto , cont , contTotal , reinicios , salto , reinicio [ salto ] ) ; goto inicio1 ; }
  60.           }
  61.         num[i][j]=numAleat[aleatorio],ocupados[0][salto][i][numAleat[aleatorio]-1]=1, ocupados[1][salto][numAleat[ aleatorio ]-1][j]=1, numAleat[aleatorio]=0 ;
  62.       }
  63.       if ( i == ( ( salto + 1 ) * fil - 1 ) && j < tam && j % col == 0 )
  64.         i = saltoFil , q += col ;
  65.       if ( i == saltoFil  && j % col == 0 )
  66.         generarNumAleatorio ( tam , numAleat ) ;
  67.     }
  68.     if ( fil > col && num [ tam -1 ][ tam -  1 ] != 0 )
  69.       break  ;
  70.   }
  71.   gotoxy (0,0) , imprimir ( num , 0 ) , gotoxy ( 0 , tam + 8 ) , imprimir ( num , 1 ) ;
  72. }
  73.  
  74. void generarNumAleatorio (  unsigned int TAM , unsigned int Algo [ TAM ] ) {
  75.     int i , temp , aleatorio ;
  76.     for ( i = 0  ; i < TAM ; i++ )
  77.       Algo [ i ] = i + 1 ;
  78.   for ( i = 0  ; i < TAM ; i++ ) {
  79.     aleatorio = 1 + rand ( ) % TAM ;
  80.     temp = Algo [ i ] ;
  81.     Algo [ i ] = Algo [ aleatorio - 1 ] ;
  82.     Algo [ aleatorio - 1 ] = temp ;
  83.   }
  84. }
  85. void generarNumAleatorio1 (  unsigned int TAM , unsigned int Algo [ TAM ] ) {
  86.     int i , temp , aleatorio ;
  87.     for ( i = 0  ; i < TAM ; i++ )
  88.       Algo [ i ] = i + 1 ;
  89.   for ( i = 0  ; i < TAM ; i++ ) {
  90.     aleatorio = 1 + rand ( ) % TAM ;
  91.     temp = Algo [ i ] ;
  92.     Algo [ i ] = Algo [ aleatorio - 1 ] ;
  93.     Algo [ aleatorio - 1 ] = temp ;
  94.   }
  95. }
  96.  
  97. void imprimir ( unsigned int algo [ tam ][ tam ] , unsigned int flag ) {
  98.   int i , j , l , p , tamx , noVer = 0.6 * tam * tam , ocultos [ Tam ] ;/** 0.6 sera variable segun nivel de dificultad **/
  99.   tamx = ( fil < col ) ? tamX : tam ;
  100.   generarNumAleatorio ( Tam , ocultos ) ;
  101.   espaciado ( ) ;
  102.   for ( i = 0 , p = 0 ; i < tamx ; i++ , p++ ) {
  103.     for ( j = 0 ; j < tam ; j++ , p++) {
  104.       if ( j > 0 && j % col == 0 )
  105.         printf ( "    *" ) ;
  106.       if ( i > 0  && i % fil == 0 && j % tam == 0 )
  107.         espaciado ( ) ;
  108.       if ( flag == 1 ) {
  109.         for ( l = 0  ; l < noVer ; l++ )
  110.           if  ( p == ocultos [ l ] ) {
  111.             printf ( "%5c" , '#' ) ;
  112.             break ;
  113.           }
  114.         if ( l == noVer )
  115.           printf ( "%5d" , algo [ i ][ j ] ) ;
  116.       }
  117.         else
  118.           printf ( "%5d" , algo [ i ][ j ] ) ;
  119.     }
  120.     putchar ( '\n' ) ;
  121.   }
  122.   espaciado ( ) ;
  123. }
  124.  
  125. void espaciado ( void ) {
  126.   int k ;
  127.   printf ( "   " ) ;
  128.   for ( k = 0 ; k < tam * 5 + ( fil - 1 ) * 4 ; k++ )
  129.     putchar ( '*' ) ;
  130.   putchar ( '\n' ) ;
  131. }
  132.  
  133. int gotoxy ( int x , int y ) {
  134.    COORD coord ;
  135.    HANDLE h_stdout ;
  136.    coord.X = x ;
  137.    coord.Y = y ;
  138.    if ( ( h_stdout = GetStdHandle( STD_OUTPUT_HANDLE ) ) == INVALID_HANDLE_VALUE )
  139.       return 0 ;
  140.    if ( SetConsoleCursorPosition (h_stdout , coord ) == 0 )
  141.       return 0 ;
  142.    return 1 ;
  143. }

Código C++:
Ver original
  1. ********************************************************************************************
  2.     7   16    3    5    *    8   15   14   10    *    1    2    9    6    *   12   13   11    4
  3.     9    1   13   10    *    7    5   12   11    *   15    8   14    4    *    2    6    3   16
  4.     4    2   14   12    *   16   13    6    9    *   10    3    7   11    *    8   15    1    5
  5.    15   11    8    6    *    2    1    4    3    *   13    5   12   16    *   10    9    7   14
  6.    ********************************************************************************************
  7.    16   13    6    1    *    4    3   11    5    *    7   15    2   12    *   14    8    9   10
  8.     2   14   15    8    *    6   16    9    7    *    5    1   10   13    *   11   12    4    3
  9.    10    4    5   11    *   14   12    2    1    *    3    6    8    9    *   15   16   13    7
  10.    12    3    9    7    *   15   10   13    8    *   11    4   16   14    *    6    1    5    2
  11.    ********************************************************************************************
  12.     3    6   12   16    *    5   11   10   13    *   14    9   15    7    *    1    4    2    8
  13.    11    5    4   14    *   12    8   16    2    *    6   10    1    3    *   13    7   15    9
  14.     1   10    2    9    *    3    4    7   15    *    8   11   13    5    *   16   14   12    6
  15.     8   15    7   13    *    9   14    1    6    *   12   16    4    2    *    5    3   10   11
  16.    ********************************************************************************************
  17.    13    9   16    4    *   10    7   15   12    *    2   14   11    8    *    3    5    6    1
  18.     6    8    1   15    *   11    9    3    4    *   16   13    5   10    *    7    2   14   12
  19.     5    7   11    2    *    1    6    8   14    *    9   12    3   15    *    4   10   16   13
  20.    14   12   10    3    *   13    2    5   16    *    4    7    6    1    *    9   11    8   15
  21.    ********************************************************************************************
  22.  
  23. Process returned 0 (0x0)   execution time : 0.759 s
  24. Press any key to continue.
  25.  
  26. SALTO::0:: contador =   251    contTotal =     8785
  27.  
  28. SALTO::1:: contador =   751    contTotal =    41270
  29.  
  30. SALTO::2:: contador =  2251    contTotal =  1286352
  31.  
  32. SALTO::3:: contador =  6751    contTotal =  5087589

Un fuerte abrazo amigo amchacon y desde ya ¡¡¡ Felices Fiestas ¡¡¡.

¡¡¡Saluditos!!!


Última edición por leosansan; 05/12/2014 a las 04:11