#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
/** 1 < fil < 6 ....1 < col < 6 ..ej: 2x3, 2x4, 3x2, 3x3, 3x5, 5x3, 4x3, 3x4, 4x4, 4x5, 4x6....¡¡¡..NO 5 x 5 ¡¡¡ ***/
#define fil 3u
#define col 3u /** NO 5 x 5 **/
#define tamXY ( fil * col )
#define tamX ( fil * fil )
#define tamY ( fil * col )
#define tam ( fil * col )
#define Tam ( tamX * tam )
void generarSudoku ( void ) ;
void generarNumAleatorio ( unsigned int TAM , unsigned int algO [ TAM ] ) ;
void imprimir ( unsigned int algo [ tam ][ tam ] , unsigned int flag ) ;
void espaciado ( ) ;
int gotoxy ( int x , int y ) ;
int main ( void ) {
generarSudoku ( ) ;
return 0 ;
}
void generarSudoku ( void ) {
unsigned int i , j , k , tamx , cont , contTotal , q , salto , saltoFil , aleatorio , num [ tam ][ tam ] , numAleat [ tam ] ;
unsigned int icont = 2500 , icontTotal = 1000000 ,/*10000000*/ ocupados [ 2 ][ fil ][ tam ][ tam ] ;
//unsigned int icont [ ]= {2500,25000,250000,250000,2500000,2500000}, icontTotal [ ] = {10000000, 50000000, 100000000, 500000000, 1000000000, 100000000} ;
static unsigned int reinicios = 0 , reinicio [ 6 ] ;
tamx = ( fil < col ) ? tamX : tam ;
for ( i = 0 ; i < tamx ; i ++ ) reinicio [ i ] = 0 ;
inicio1 : /** <=== INICIO1 **/
for ( salto = 0 , contTotal = 0 ; salto < fil ; salto++ ) {
saltoFil = salto * fil - 1 ;
inicio : /** <=== INICIO **/
for ( i = 0 ,cont = 0 ; i < tamx ; i ++ )
for ( j = 0 ; j < tam ; j++ ) {
if ( salto == 0 )
for ( k = 0 ; k < fil ; k ++ )
ocupados [ 0 ][ k ][ i ][ j ] = ocupados [ 1 ][ k ][ i ][ j ] = 0 ;
else
ocupados [ 0 ][ salto ][ i ][ j ] = ocupados [ 0 ][ salto - 1 ][ i ][ j ] , ocupados [ 1 ][ salto ][ i ][ j ] = ocupados [ 1 ][ salto - 1 ][ i ][ j ] ;
if ( i >= salto * fil )
num [ i ][ j ] = 0 ;
}
generarNumAleatorio ( tam , numAleat ) ;
for ( i = salto * fil , q = 0; i < ( salto + 1 ) * fil ; i++ ) {
aleatorio
= rand ( ) % tam
; for ( j
= q
; j
< q
+ col
; j
++ , aleatorio
= rand ( ) % tam
) { while ( ocupados [ 0 ][ salto ][ i ][ numAleat [ aleatorio ] - 1 ] == 1 || ocupados [ 1 ][ salto ][ numAleat [ aleatorio ] - 1 ][ j ] == 1 || numAleat [ aleatorio ] == 0 ) {
aleatorio
= rand ( ) % tam
, contTotal
++ , cont
++ ; if ( cont > icont /*icont [ salto ]*/ )
{ gotoxy ( 0 , 2 * tam + 16 ) ;
printf ( "SALTO::%u:: contador = %8u\tcontTotal = %10u\treinicios = %4u\treinicios [ %d ] = %4u\n" , salto
, cont
, contTotal
, reinicios
, salto
, reinicio
[ salto
] ) ; //gotoxy(0,2*tam+20),imprimir(num,0); /** Activalo si lo quieres ver trabajando, pero en valores mayores ralentiza el resultado final **/
goto inicio ;}
if ( contTotal > icontTotal/* icontTotal [ salto ]*/ )
{ 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
; } }
num[i][j]=numAleat[aleatorio],ocupados[0][salto][i][numAleat[aleatorio]-1]=1, ocupados[1][salto][numAleat[ aleatorio ]-1][j]=1, numAleat[aleatorio]=0 ;
}
if ( i == ( ( salto + 1 ) * fil - 1 ) && j < tam && j % col == 0 )
i = saltoFil , q += col ;
if ( i == saltoFil && j % col == 0 )
generarNumAleatorio ( tam , numAleat ) ;
}
if ( fil > col && num [ tam -1 ][ tam - 1 ] != 0 )
break ;
}
gotoxy (0,0) , imprimir ( num , 0 ) , gotoxy ( 0 , tam + 8 ) , imprimir ( num , 1 ) ;
}
void generarNumAleatorio ( unsigned int TAM , unsigned int Algo [ TAM ] ) {
int i , temp , aleatorio ;
for ( i = 0 ; i < TAM ; i++ )
Algo [ i ] = i + 1 ;
for ( i = 0 ; i < TAM ; i++ ) {
aleatorio
= 1 + rand ( ) % TAM
; temp = Algo [ i ] ;
Algo [ i ] = Algo [ aleatorio - 1 ] ;
Algo [ aleatorio - 1 ] = temp ;
}
}
void generarNumAleatorio1 ( unsigned int TAM , unsigned int Algo [ TAM ] ) {
int i , temp , aleatorio ;
for ( i = 0 ; i < TAM ; i++ )
Algo [ i ] = i + 1 ;
for ( i = 0 ; i < TAM ; i++ ) {
aleatorio
= 1 + rand ( ) % TAM
; temp = Algo [ i ] ;
Algo [ i ] = Algo [ aleatorio - 1 ] ;
Algo [ aleatorio - 1 ] = temp ;
}
}
void imprimir ( unsigned int algo [ tam ][ tam ] , unsigned int flag ) {
int i , j , l , p , tamx , noVer = 0.6 * tam * tam , ocultos [ Tam ] ;/** 0.6 sera variable segun nivel de dificultad **/
tamx = ( fil < col ) ? tamX : tam ;
generarNumAleatorio ( Tam , ocultos ) ;
espaciado ( ) ;
for ( i = 0 , p = 0 ; i < tamx ; i++ , p++ ) {
for ( j = 0 ; j < tam ; j++ , p++) {
if ( j > 0 && j % col == 0 )
if ( i > 0 && i % fil == 0 && j % tam == 0 )
espaciado ( ) ;
if ( flag == 1 ) {
for ( l = 0 ; l < noVer ; l++ )
if ( p == ocultos [ l ] ) {
break ;
}
if ( l == noVer )
printf ( "%5d" , algo
[ i
][ j
] ) ; }
else
printf ( "%5d" , algo
[ i
][ j
] ) ; }
}
espaciado ( ) ;
}
void espaciado ( void ) {
int k ;
for ( k = 0 ; k < tam * 5 + ( fil - 1 ) * 4 ; k++ )
}
int gotoxy ( int x , int y ) {
COORD coord ;
HANDLE h_stdout ;
coord.X = x ;
coord.Y = y ;
if ( ( h_stdout = GetStdHandle( STD_OUTPUT_HANDLE ) ) == INVALID_HANDLE_VALUE )
return 0 ;
if ( SetConsoleCursorPosition (h_stdout , coord ) == 0 )
return 0 ;
return 1 ;
}