Bonjour à tous,
voila comme projet de fin d'année (comme beaucoup de monde) j'ai le classique sudoku à développer en C.
Je rencontre un probleme au niveau d'un compteur situé sur ma grille[11][10] : la premiere ligne et premiere colonne sont
réservés aux compteurs (respectivement de colonnes et lignes). La derniere ligne contient les compteurs de chaque pavé (colonne 1 => pavé 1)
Mon cube des possibilités est fait comme ceci : cube[11][10][10]
Meme principe au niveau des compteurs. Ces lignes sont inutilisées pour le plan 0 et initialisées a 1.
Les cellules des lignes et colonnes 1 à 9 contiennent le nombre de possibilités par case de la grille.
Les plan suivant : 0 si pas possible, 1 si possible.
Bref.
Apres ma troisième méthode de résolution, le compteur en grille[0][0] bug.
J'ai beau regarder, je ne trouve pas d'ou cela vient.
Je précise que MAX = 9 et MAX2 = 3
Ma methode 3 :
majCompteurs :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 // RESOLUTION DE LA GRILLE METHODE 3 /* Parcours par ligne, colonne et region chaque plan pour voir si une valeur est possible une seule fois. Si oui, la valeur est celle de la case. */ void methode3(Cube c, Grille grille) { int i, j, k, lig, col; for(k=1;k<=MAX;k++) { for(i=1;i<=MAX;i++) { if(c[i][0][k]==1){ for(j=1;j<=MAX;j++) // Lignes { if(c[i][j][k]==1) {grille[i][j]=k; majCaseGrilleCube(c,i,j,k); majCompteurs(grille,i,j);} } } if(c[0][i][k]==1){ for(j=1;j<=MAX;j++) // Colonnes { if(c[j][i][k]==1) {grille[j][i]=k; majCaseGrilleCube(c,j,i,k); majCompteurs(grille,j,i);} } } if(c[MAX+1][i][k]==1) {// Regions for(lig=1+(i-1)/MAX2*MAX2;lig<1+(i-1)/MAX2*MAX2+MAX2;lig++) { for(col=1+(i-1)%MAX2*MAX2;col<1+(i-1)%MAX2*MAX2+MAX2;col++) { if(c[lig][col][k]==1) { grille[lig][col]=k; majCaseGrilleCube(c,lig,col,k); majCompteurs(grille,lig,col);} } } } } } }
majCaseGrilleCube :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 void majCompteurs(Grille grille, int i, int j) { grille[0][j]++; grille[i][0]++; grille[0][0]++; grille[MAX+1][region(i,j)]++; }
et majCaseCube :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 void majCaseGrilleCube(Cube cube, int i, int j, int v) { int l, c, ideb=1+(i-1)/MAX2*MAX2, jdeb=1+(j-1)/MAX2*MAX2; for(c=1;c<=MAX;c++) { if(cube[i][c][v] == 1) { majCaseCube(cube,i,c,v);//Maj de la ligne } } for(l=1;l<=MAX;l++) { if(cube[l][j][v] == 1) { majCaseCube(cube,l,j,v);//Maj de la colonne } } for(l=ideb;l<ideb+MAX2;l++) { for(c=jdeb;c<jdeb+MAX2;c++) { if(cube[l][c][v] == 1) { majCaseCube(cube,l,c,v); } //Maj de la region } } cube[i][j][0]=0; }
Merci beaucoup à ceux qui se penchent sur mon probleme
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 void majCaseCube(Cube cube, int x, int y, int v) { if(cube[x][y][v] == 1) { cube[x][y][v]=0; // 1 -> 0 cube[0][y][v]--; cube[x][0][v]--; cube[MAX+1][region(x,y)][v]--; if(cube[x][y][0]>0) { cube[x][y][0]--; } } }
Si vous avez des questions ou que je me suis mal expliqué, ce qui ne m'étonnerais pas... j'y répond.
Je cherche aussi a faire une méthode par choix multiple (par hypothese)
Si quelqu'un peut me mettre sur la voie, j'accepte votre aide ! J'ai deja bien commencer ma fonction mais elle ne donne
pas grand chose pour le moment.
Encore merci
Partager