- Lo0
Elite
Bonjour, tout le monde. Je dois faire une programme de sudoku en C pour l'école et donc la premiere étape est de crée une grille complete de sudoku. Pour ca pas de probleme, je procede de la facon la plus élémentaire qui soit, cad je pioche une nombre au hasard et je vérifie qu'il n'a pas d'équivalent dans la ligne, colone ou sous grille, aux quelle cas je repioche un nombre un certain nombre de fois, s'il ne trouve pas, je recommence la grille a 0.
Jusque la pas de probleme, je fait cette partie la dans mon main() et ca marche tres bien. Cependant, je dois crée une fonction pour faire ca, donc pas de probleme, je fait copier / coller en écrivant au dessus
int CreeGrilleSudoku (int tab[][9] );
/*-----------------------------------------------------------------
// DESCRIPTION : Crée une grille de sudoku aléatoire
// IN :
// OUT : tab = le tableau dans le quelle ont écris les valeur de la grille
// RETURN : le nombre d'essais pour créer la grille
//-----------------------------------------------------------------*/
int CreeGrilleSudoku (int tab[][9] )
Je suprime le int tab[][9] qui se retrouve redondant. Et la, pouf, ca marche plus. Il éxécute bien la fonction mais il mouline a l'infini ( en évitant d'éxécuter certain if diront on ). =/
Quelqu'un a pas une idée du probleme ?
Pour info, voici mes deux programme avant et apres, quand ca marche et quand ca marche pas
Aussi : Intro_Matrice_i_Aleatoire(9, 9, tab, 0, 0 ) ; : crée une matrice avec que des 0 dedans
Affiche_Matrice_i(9, 9, tab ) ; : affiche la matrice
Donc quand ca marche.
Quand ca marche pas
Jusque la pas de probleme, je fait cette partie la dans mon main() et ca marche tres bien. Cependant, je dois crée une fonction pour faire ca, donc pas de probleme, je fait copier / coller en écrivant au dessus
int CreeGrilleSudoku (int tab[][9] );
/*-----------------------------------------------------------------
// DESCRIPTION : Crée une grille de sudoku aléatoire
// IN :
// OUT : tab = le tableau dans le quelle ont écris les valeur de la grille
// RETURN : le nombre d'essais pour créer la grille
//-----------------------------------------------------------------*/
int CreeGrilleSudoku (int tab[][9] )
Je suprime le int tab[][9] qui se retrouve redondant. Et la, pouf, ca marche plus. Il éxécute bien la fonction mais il mouline a l'infini ( en évitant d'éxécuter certain if diront on ). =/
Quelqu'un a pas une idée du probleme ?
Pour info, voici mes deux programme avant et apres, quand ca marche et quand ca marche pas
Aussi : Intro_Matrice_i_Aleatoire(9, 9, tab, 0, 0 ) ; : crée une matrice avec que des 0 dedans
Affiche_Matrice_i(9, 9, tab ) ; : affiche la matrice
Donc quand ca marche.
Code:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define MAXESSAIS 50
#include "..\vecteur.h"
#include "..\matrice.h"
main()
{
int i, j, k, a,b, tab[9][10], redonne = 0, compteur = 1, essais = 0, essais2 = 0 ; // compteur = 1 car si réussi premier coup compte 0x
Intro_Matrice_i_Aleatoire(9, 9, tab, 0, 0 ) ;
srand((unsigned) time(NULL) + rand());
for( i=0 ; i<9 ; i++ )
for ( j=0; j<9 ; j++ )
{
tab[i][j] = rand() % 9 + 1;
if ( j != 0 )
for( k = j-1 ; k >= 0 ; k-- )
{
if (tab[i][k] == tab[i][j] ) // A
{
redonne = 1 ;
k = 0 ;
}
}
// printf("test1") ;
if (redonne == 0 && i != 0)
{
// printf("test2") ;
for( k = i-1 ; k >= 0 ; k-- ) // B
{
if (tab[k][j] == tab[i][j] )
{
redonne = 1 ;
k = 0 ; // empeche de calculer pour rien, sort de la boucle
essais++ ;
}
}
}
if ( redonne == 0 && ( i!=0 || j!=0 ) ) // C
for ( a = i - i%3 ; a < i - i%3 + 3 ; a++ )
for ( b = j - j%3 ; b < j - j%3 + 3 ; b++ )
{
if ( ( a != i || b != j ) && tab[a][b] == tab[i][j])
{
redonne = 1 ;
essais2++ ;
a = 10 ;
b = 10 ;
// printf( "test") ;
}
}
//printf("tot") ;
if(redonne == 1 )
j-- ;
//else if( redonne == 3 )
else if ( redonne == 0 )
essais = 0 ;
redonne = 0 ;
if ( essais == MAXESSAIS || essais2 == MAXESSAIS )
{
// printf("TOTO1") ;
Intro_Matrice_i_Aleatoire(9, 9, tab, 0, 0 ) ;
essais = 0 ;
essais2 = 0 ;
i = -1 ;
j = -1 ;
compteur++ ;
}
}
Affiche_Matrice_i(9, 9, tab ) ;
printf("\n %d ", compteur ) ;
}
Code:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define MAXESSAIS 50
#include "D:\Documents and Settings\ggh\Bureau\module\vecteur.h"
#include "D:\Documents and Settings\ggh\Bureau\module\matrice.h"
int CreeGrilleSudoku (int tab[][9] ) ;
/*-----------------------------------------------------------------
// DESCRIPTION : Crée une grille de sudoku aléatoire
// IN :
// OUT : tab = le tableau dans le quelle ont écris les valeur de la grille
// RETURN : le nombre d'essais pour créer la grille
//-----------------------------------------------------------------*/
int CreeGrilleSudoku (int tab[][9] )
{
int i, j, k, a,b, redonne = 0, compteur = 1, essais = 0, essais2 = 0 ; // compteur = 1 car si réussi premier coup compte 0x
Intro_Matrice_i_Aleatoire(9, 9, tab, 0, 0 ) ;
Affiche_Matrice_i(9, 9, tab ) ;
srand((unsigned) time(NULL) + rand());
for( i=0 ; i<9 ; i++ )
for ( j=0; j<9 ; j++ )
{
tab[i][j] = rand() % 9 + 1;
if ( j != 0 )
for( k = j-1 ; k >= 0 ; k-- )
{
if (tab[i][k] == tab[i][j] ) // A
{
redonne = 1 ;
k = 0 ;
printf("testKK" ) ;
}
}
printf("test1") ;
if (redonne == 0 && i != 0)
{
printf("test2") ;
for( k = i-1 ; k >= 0 ; k-- ) // B
{
if (tab[k][j] == tab[i][j] )
{
redonne = 1 ;
k = 0 ; // empeche de calculer pour rien, sort de la boucle
essais++ ;
}
}
}
if ( redonne == 0 && ( i!=0 || j!=0 ) ) // C
for ( a = i - i%3 ; a < i - i%3 + 3 ; a++ )
for ( b = j - j%3 ; b < j - j%3 + 3 ; b++ )
{
if ( ( a != i || b != j ) && tab[a][b] == tab[i][j])
{
redonne = 1 ;
essais2++ ;
a = 10 ;
b = 10 ;
printf( "test") ;
}
}
printf("tot %d", essais) ;
if(redonne == 1 )
j-- ;
//else if( redonne == 3 )
else if ( redonne == 0 )
essais = 0 ;
redonne = 0 ;
if ( essais == MAXESSAIS || essais2 == MAXESSAIS )
{
printf("TOTO1") ;
Intro_Matrice_i_Aleatoire(9, 9, tab, 0, 0 ) ;
essais = 0 ;
essais2 = 0 ;
i = -1 ;
j = -1 ;
compteur++ ;
}
}
Affiche_Matrice_i(9, 9, tab ) ;
return compteur ;
}
main()
{
int tab[9][10], compteur ;
compteur = CreeGrilleSudoku( tab ) ;
Affiche_Matrice_i(9, 9, tab ) ;
printf("\n %d ",compteur) ;
}