$iNbPt) & ($iCount > 0)) { $iTp[$iCount] = 1; $iCount--; if ($iCount == 0) { $fFinCalcul = True; break; } else { $iTp[$iCount]++; } } } //======================================================================================= // Test de l'unicité de la solution en cours //====================================================================================== Function TestUnicite($iIndice) { global $iTp; // Comparer les n-1 première valeur avec la valeur iTp(n) For ($iCC = 1; $iCC <= $iIndice - 1; $iCC++) { If (($iTp[$iCC] == $iTp[$iIndice]) || ($iTp[1] > 1 & $iTp[2] != 1)) return(False); } return(True); } //======================================================================================= // Affichage d'une ligne de résultat //=======================================================================================' function Affiche() { global $iTp; global $iCountResult; global $iNbPt; global $resultat; $iSommeSommets = 0; $iSommeCreux = 0; For ($iCountLocal = 1 ; $iCountLocal <= $iNbPt ; $iCountLocal++) { $resultat[$iCountLocal][$iCountResult] = $iTp[$iCountLocal]; print($iTp[$iCountLocal]); print(" "); } print("
"); } //====================================================================================== // Test de l'existance d'une solution mirroir dans les solutions déjà trouvée //====================================================================================== Function TestMirroir($iIndice) { global $iCountResult; global $resultat; global $iTp; global $iNbPt; If ($iCountResult < 2) { return(False); } ElseIf ($iTp[1] == 1 ) { For ($iLigne = $iCountResult ; $iLigne > 0 ; $iLigne--) { $bTest = True; For ($iLoc = 1 ; $iLoc <= ($iNbPt - 1) ; $iLoc++) { If ($resultat[$iLoc + 1][$iLigne] != $iTp[$iNbPt - $iLoc + 1]) { $bTest = False; break; } } If ($bTest == True) { return(True); } } } ElseIf ($iTp[2] == 1) { For ($iLigne = $iCountResult ; $iLigne > 0 ; $iLigne--) { $bTest = True; If ($resultat[1][$iLigne] == $iTp[3]) { For ($iLoc = 1 ; $iLoc < ($iNbPt - 3) ; $iLoc++) { If ($resultat[$iNbPt - $iLoc + 1][$iLigne] != $iTp[$iLoc + 3]) { $bTest = False; break; } } } Else { $bTest = False; } If ($bTest == True) { return(True); } If ($resultat[2][$iLigne] != 1) { break; } } } return(False); } //=================================================================================== // Fonction de calcul des solutions des croix magiques // Par Christian Ehrhart en octobre 2004 //=================================================================================== function lancement_calcul() { global $resultat; // le tableau des résultats global $iTp; // tableau des points global $iCount; // compteur des points global $iCountResult; // compteur de résultats global $iNbPt; // nombre de points global $iCote; // nombre de coté global $iSomme; // somme d'un coté global $iBoucle; // compteur de boucle global $iPlus; // autre compteur de boucle (dés fois qu'on vienne à manquer') global $iSommeInter; // pour le stockage de sommes intermédiaires global $iSommeFinale1; // Pour stocker la somme du dernier coté global $iSommeFinale2; // Pour stocker la somme de l'avant dernier coté global $fFinCalcul; // Fin de calcul en boucle // $iCote = Sheets("Accueil").Cells(1, 2).Value; // récupération du paramètre du nombre de coté if ($iCote < 5) { die("Il faut au moins 5 faces pour le calcul
"); } else { // initialisation des variables $iNbPt = $iCote * 2; // nombre de points = nombre de coté*2 $iSomme = ($iNbPt + 1) * 2; // somme d'un coté = (nombre de points + 1) * 2 // Affichage d'info utilisateur echo "Début de calcul: ".Date("j/m/Y G:i")."
"; // Calcul proprement dit // initialisation du tableau de valeur For ($iCount = 1 ; $iCount <= $iNbPt ; $iCount++) { $iTp[$iCount] = 1; } $iTp[2] = 2; // mise à zéro des compteurs $fFinCalcul = False; $iCount = 2; $iCountResult = 0; // Boucle de calcul While ($fFinCalcul == False) { If (TestUnicite($iCount) == True) { If ($iCount == $iNbPt) { $iSommeFinale1 = $iTp[$iNbPt - 1] + $iTp[$iNbPt] + $iTp[2] + $iTp[3]; $iSommeFinale2 = $iTp[$iNbPt - 3] + $iTp[$iNbPt - 2] + $iTp[$iNbPt] + $iTp[1]; If (($iSommeFinale1 == $iSomme) & ($iSommeFinale2 == $iSomme)) { If (TestMirroir($iCount) == False) { $iCountResult++; Affiche(); } } IncrementiTp(); } ElseIf (($iCount > 4) & (($iCount % 2) == 1)) { $iSommeInter = $iTp[$iCount - 4] + $iTp[$iCount - 3] + $iTp[$iCount - 1] + $iTp[$iCount]; If ($iSommeInter == $iSomme) { $iCount++; } Else { IncrementiTp(); } } Else { $iCount++; } } Else { IncrementiTp(); } } } // Affichage des données de calcul echo "Calcul terminé : ".Date("j/m/Y G:i")."
"; echo "Nombre de solutions uniques : ".$iCountResult."
"; echo "Nombre total solutions : ".(($iCountResult*2)*$iCote)."
"; } set_time_limit("0"); $iCote = $_GET['nbcote']; lancement_calcul(); ?>