Le picross est un jue style journal, oû l'on doit remplir une grille de cases selon des indices sur les côtés. Par exemple, une ligne avec les indices 5-2 indique que la ligne correspond à un bloc de 5 cases noires, au moins un blanc, puis un bloc de 2 cases noires. L'objectif est donc de comparer les indices des lignes et des colonnes pour remplir la grille. Vous pouvez tenter de jouer ici pour bien saisir les règles : https://fr.puzzle-nonograms.com/
Pour étudier la complexité des algorithmes, un projet du second trimestre consiste à programmer un solveur picross de deux manières différentes: Une version naïve qui essaie toutes les possibilités, et une version avec propagation de contraintes plus maligne. Nous étions en binôme pour ce projet, et je me suis concentré sur la deuxième méthode alors que mon camarade programmais la première. Je me concentrerais donc sur la seconde.
La méthode par propagation de contraintes fonctionne comme ceci: Chaque ligne peut avoir des cases certaines selon les indices déjà présents. Par exemple dans une ligne de 5 cases avec comme indices 3, il y a trois possibilités:
3|XXX__
3|_XXX_
3|__XXX
On voit que qelque soit la réponse, la case du milieu sera toujours noire. On peut donc dors et déjà la colorier en noir.
Ensuite, les colonnes pourrons prendre cette case en compte
Par exemple, pour une colonne d'indices 2, avec cette case en première ligne:
2222
----
X___
XX__
_XX_
__XX
___X
On ne peut pas trouver de cases certaines dans cette configuration,
Mais connaitre une case suffit à ne garder que 2 possibilités (soit 2 nouvelles cases certaines), voire une seule si cette case est sur un bord.Ensuite, il reste à calculer la complexité du programme, c'est à dire comment la durée du programme évolue selon la taille de la grille. Récapitulons. Pour une grille de taille n*n, avec une densité k :