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 :
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);}
 
								}
							}
						}
		}
	}
}
majCompteurs :
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)]++;
}
majCaseGrilleCube :
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;
}
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
 
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]--;
		}
	}
}
Merci beaucoup à ceux qui se penchent sur mon probleme
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