/*************************************************************************************************************************************/ /* */ /* T R I A N G L E M A G I Q U E : */ /* */ /* */ /* Author of '$xtc/TriMagik.02$c' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20050101105250). */ /* */ /*************************************************************************************************************************************/ #include "INCLUDES.01.I" /* Introduit le 20051116095356... */ extern double log10(); #define RechercheMaximum(t,l,i) \ { \ for (i=PREMIER ; (t=l[i]) != NuLl ; i++) \ { \ maximum = MAX2(t,maximum); \ } \ } #define D \ ((((int)log10((double)maximum))+1)+2) \ /* La derniere constante additive (+2) definit l'espacement entre les valeurs editees... */ #define NuLl \ 0 #define ListeAPriori \ 1,2,3,4,5,6,7,NuLl #define PREMIER \ 0 main() { int differents=1; /* Cet indicateur controle la "repetabilite" des valeurs en chaque noeud : */ /* */ /* =0 : plusieurs noeuds peuvent contenir des valeurs identiques, */ /* #0 : les noeuds ne peuvent contenir que des valeurs differentes. */ /* */ int maximum=-1000000; /* Afin de rechercher le maximum des differentes listes... */ int solutions=0; /* Nombre de solutions trouvees... */ int l11[]={ListeAPriori}; int l21[]={ListeAPriori}; int l22[]={ListeAPriori}; int l23[]={ListeAPriori}; int l31[]={ListeAPriori}; int l32[]={ListeAPriori}; int l33[]={ListeAPriori}; /* Liste des valeurs possibles des sept noeuds. Il faut en fait : */ /* */ /* int l31[]={1,NuLl}; */ /* */ /* pour resoudre le probleme de Valentine Parmentier... */ int i11; int i21,i22,i23; int i31,i32,i33; /* Liste des index d'acces aux valeurs possibles des sept noeuds. */ int t11; int t21,t22,t23; int t31,t32,t33; /* Liste des valeurs courantes des sept noeuds : */ /* */ /* t11 */ /* / | \ */ /* / | \ */ /* / | \ */ /* t21--t22--t23 */ /* / | \ */ /* / | \ */ /* / | \ */ /* t31-------t32-------t33 */ /* */ /* tout ceci etant pour Valentine Parmentier... */ RechercheMaximum(t11,l11,i11); RechercheMaximum(t21,l21,i21); RechercheMaximum(t22,l22,i22); RechercheMaximum(t23,l23,i23); RechercheMaximum(t31,l31,i31); RechercheMaximum(t32,l32,i32); RechercheMaximum(t33,l33,i33); for (i31=PREMIER ; (t31=l31[i31]) != NuLl ; i31++) { for (i32=PREMIER ; (t32=l32[i32]) != NuLl ; i32++) { if ( (differents == 0) \ || ( (t32 != t31) \ ) \ ) { for (i33=PREMIER ; (t33=l33[i33]) != NuLl ; i33++) { if ( (differents == 0) \ || ( (t33 != t31) \ && (t33 != t32) \ ) \ ) { for (i21=PREMIER ; (t21=l21[i21]) != NuLl ; i21++) { if ( (differents == 0) \ || ( (t21 != t31) \ && (t21 != t32) \ && (t21 != t33) \ ) \ ) { for (i22=PREMIER ; (t22=l22[i22]) != NuLl ; i22++) { if ( (differents == 0) \ || ( (t22 != t31) \ && (t22 != t32) \ && (t22 != t33) \ && (t22 != t21) \ ) \ ) { for (i23=PREMIER ; (t23=l23[i23]) != NuLl ; i23++) { if ( (differents == 0) \ || ( (t23 != t31) \ && (t23 != t32) \ && (t23 != t33) \ && (t23 != t21) \ && (t23 != t22) \ ) \ ) { for (i11=PREMIER ; (t11=l11[i11]) != NuLl ; i11++) { if ( (differents == 0) \ || ( (t11 != t31) \ && (t11 != t32) \ && (t11 != t33) \ && (t11 != t21) \ && (t11 != t22) \ && (t11 != t23) \ ) \ ) { int l1=t11+t21+t31; int l2=t11+t22+t32; int l3=t11+t23+t33; int l4=t21+t22+t23; int l5=t31+t32+t33; /* Calcul des cinq longueurs qui, pour un triangle magique, doivent etre egales... */ if ( (l1 == l2) \ && (l2 == l3) \ && (l3 == l4) \ && (l4 == l5) \ ) { solutions++; printf("Un TRIANGLE MAGIQUE a ete trouve "); printf("(longueur des cinq alignements=%d) :\n\n",l1); printf("%*d\n",D+D+D,t11); printf("%*d%*d%*d\n",D+D,t21,D,t22,D,t23); printf("%*d%*d%*d\n",D,t31,D+D,t32,D+D,t33); printf("\n\n"); /* On a trouve un triangle magique... */ } else { } } else { } } } else { } } } else { } } } else { } } } else { } } } else { } } } printf("Il y a au total %d solution[s] differente[s].\n\n",solutions); }