$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();
?>