Sudoku: determiner les chiffres candidats

 

Ecrire programme Sudoku : déterminer les candidats

Par  Ettougourti Mohamed Ali

Chaque case de la grille sudoku est traitée comme une structure.  Les informations relatives à chaque cellule sont sauvegardées sous la forme suivante :

public struct cell

{

public Point p;

public int width;

public int height;

public char c;

public bool iscontrainte;

public char[]candidates;

public int nbcandidates;

}

Un élément de la structure nous intéresse particulièrement il s’agit de ‘iscontrainte ‘. S’il est mis à false ou faux c’est que la case est libre et n’est pas fixée par la grille dès le départ comme étant une contrainte du jeu.

C’est une case qu’on peut remplir par des chiffres candidats potentiels.

Mais une case peut aussi comporter un chiffre unique que le joueur a saisi. Elle n’est pas donc libre et nous devons éviter de la remplir des chiffres candidats au risque d’écraser le chiffre introduit par le joueur. C’est ainsi que nous prenons le soin dès le départ de remplir toutes les cases libres qui ne comportent aucun chiffre saisi par le joueur et qui ne sont pas des contraintes du jeu par la lettre « X » pour inconnu.

Pour chaque case nous devons vérifier s’il s’agirait d’une contrainte ou pas et si une éventuelle saisie du joueur a rempli la case par un chiffre déterminé.

Ces deux précautions prises nous cherchons les candidats possibles pour chaque case libre en faisant appel à une fonction baptisée controlvalid2.

Controlvalid2 doit chercher dans chaque ligne ainsi que dans chaque colonne et dans chaque région ou petit carré ou la case se trouve  si le chiffre proposé comme candidat est déjà utilisé auquel cas elle renvoie un -1 dans le cas contraire elle renvoie un chiffre positif 1.

Une fois l’ok donné par la routine controlvalid2 la fonction SetCandidates affiche le chiffre en tant que chiffre candidat potentiel.

Voici la fonction SetCandidates qui remplit les cellules de chiffres candidats potentiels.

Pour la fonction du contrôle de la validité elle sera expliquée dans un prochain article . la fonction getregion nous permet de déterminer la région (ou petit carré à l’intérieur de la grille) ou se trouve la case à remplir de chiffres candidats. Elle fera elle aussi l’objet du prochain article.

private void SetCandidates()

{

for (int i = 0; i < 81; i++) // 81 case 9*9

{

if (cells[i].iscontrainte == false  && cells[i].c==’X’)

{

effacer(cells[i].p);

cells[i].candidates = new char[9]; // creer le tableau

int j = 0;

cells[i].nbcandidates = 0;

for (char k = ‘1’; k < (char)58; k++) // char(58) = ‘9’ +1

{

                        if (Controlvalid2(i, k) == 1)

{

cells[i].candidates[j++] = k;

cells[i].nbcandidates = j;

}

}

}

}

afficheCandidates();       // appel à une fonction affichant les                                                                               //chiffres candidats pour la case

}




(68)