Croix magiques : l'algorithme détaillé

Algorithme principal

Posons d'abord, nombre de points = iNbPt, nombre de coté = iCote et somme d'un coté = iSomme.

Au début posons iTp[1] = 1 et tous les autres points (iTp[t] pour t = 2 à iNbPt) = 2.

iTp[1] = 1; iTp[2] = 2; iTp[3] = 2... iTp[iNbPt] = 2

 

On va donc incrémenter iTp[3]

iTp[1] = 1; iTp[2] = 2; iTp[3] = 3; iTp[4] = 2... iTp[iNbPt] = 2

Si iTp[1], iTp[2] et iTp[3] sont différents (fonction Test Unicité dans le code), alors, tant que iTp[4] n'est pas différent des trois premiers, on peut incrémenter iTp[4]. Jusqu'à :

iTp[1] = 1; iTp[2] = 2; iTp[3] = 3; iTp[4] = 4; iTp[5] = 2 ... iTp[iNbPt] = 2

A chaque incrément d'un point, il faut se poser la question : "Mes premiers points répondent-ils aux contraintes de l'exercice ?" C'est à dire, en traduction informatique : Si j'ai plus de cinq points, les premières sommes sont-elles égales à la constante attendue : iSomme..

Appelons le pointeur du point incrémenté iCountPt. Si iCountPt >= 5 et iCountPt modulo 2 = 1 alors, il faut calculer les sommes :

iTp[iCountPt - 4] + iTp[iCountPt - 3] + iTp[iCountPt - 1] + iTp[iCountPt].

Si cette somme est égale à iSomme alors on peut incrémenter le point suivant, ce qui revient à incrémenter iCountPt dans le code.

iTp[1] = 1 ; iTp[2] = 3 ; iTp[3] = 4 ; iTp[4] = 14 ; iTp[5] = 16 ; iTp[6] = 2 ... iTp|iNbPt] = 2

Si le point incrémenté est le dernier, que toutes les sommes de tous les cotés sont égales iSomme et que la solution trouvée n'est pas la symétrie mirroir d'une solution déjà obtenue, on peut stocker le résultat dans le tableau resultat et incrémenter le compteur de résultat trouvé, iCountResult.

Si le point incrémenté arrive au maximum iNbPt, comme iTp[5] dans la ligne précédente, c'est que l'on a pas trouvé de combinaison satisfaisante pour les iCountPt-1 premiers points. Donc on va décrémenté iCountPt pour chercher une combinaison sur ces iCountPt - 1 premiers points (dans la fonction Increment dans le code). Si le point précédent est lui-même arrivé au maximum, il faut passer encore au point précédent, etc.. jusqu'à ce que l'on cherche à incrémenter le premier point, auquel cas on passe iTp[2] à 1 et on peut incrémenter iTp[1].

Quand iTp[1] vaut iNbPt + 1, la boucle s'arrête et on a trouvé toutes les solutions.

 

<< Accueil
Test de l'algorithme >>