Si je peux me permettre, je trouve ton algo bien trop détaillé.
Par exemple, pour implémenter un check si il y a une solution en un coup je partirai du principe :
en notant G la case gagnante p(G) la case précédente dans le sens antihoraire
Si G contient 16 ou 32 pions elle est gagnante en 1 coup
si p(G) contient 1 ou 17 pions alors elle est gagnante,
si p(G) contient un nombre non nul de pions alors p(p(G)) devra en contenir 2 ou 18 ou …
si p(G) ne contient aucun pion alors c'est la suivante qui jouera son rôle et p(p(G)) devra en contenir 1 ou 17, ou …
si on en trouve aucune et qu'on revient au point de départ G alors c'est qu'il n'y a aucune solution en 1 coup.
Les … représentent en fait un appel récursif. On voit qu'il y un nombre de pions particulier qui sert d'objectif. On peut imaginer un algorithme plus lisible :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
booléen check_1_coup(G)
Début
si contenu(G)==16 ou 32 alors
renvoyer Vrai
sinon
renvoyer check_1_coup_objectif(G,p(G),1)
Fin.
booléen check_1_coup_objectif(G, courante, objectif)
Début
si courante=G alors
renvoyer Faux
sinon si contenu(courante) modulo 16=objectif alors
renvoyer Vrai
sinon si contenu(courante)=0 alors
renvoyer check_1_coup_objectif(G,p(courante),objectif)
sinon
renvoyer check_1_coup_objectif(G,p(courante),objectif+1)
Fin. |
À partir du moment où tu arrives à implémenter les primitives contenu et p le tour est joué.
S'il n'y a aucune solution en un coup alors il faut faire une recherche en parcourant tous les coups possibles, en première idée : backtracking.
Partager