/*************************************************************************************************************************************/
/* */
/* P A R C O U R S E N " Z I G - Z A G " D ' U N E M A T R I C E C A R R E E : */
/* */
/* */
/* Author of '$xtc/zig_zag.01$c' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, AAAAMMJJhhmmss). */
/* */
/*************************************************************************************************************************************/
#include "INCLUDES.01.I"
/* Introduit le 20051116103411... */
#define DIMENSION \
(DEUX*DEUX)
#define DEUX \
2
#define INDEX0 \
0
#define INDX(k) \
INTE((k) - INDEX0)
#define LSTX(nombre) \
INTE(INDEX0 + ((nombre) - 1))
#define COMPLEMENT(k) \
(LSTX(DIMENSION)-INDX(k))
#define INTE(x) \
((int)(x))
#define SOMME_1_DE_0_a_N(n) \
(((n)*((n)+1))/2)
#define FONCTION(i,j) \
(SOMME_1_DE_0_a_N(INDX(i)+INDX(j)) \
+COND(EST_PAIR(INDX(i)+INDX(j)) \
,INDX(i) \
,INDX(j) \
) \
)
main()
{
int i,j;
/* Indices de la matrice. */
int index;
/* Index lineaire cherche... */
int fonction_directe[DIMENSION][DIMENSION];
/* Definition de la fonction avec une matrice. */
int fonction_inverse_i[DIMENSION*DIMENSION];
int fonction_inverse_j[DIMENSION*DIMENSION];
/* Definition de la fonction inverse avec 2 tableaux {i,j}. */
for (j=INDEX0 ; j<=LSTX(DIMENSION) ; j++)
{
for (i=INDEX0 ; i<=LSTX(DIMENSION) ; i++)
{
fonction_directe[i][j] = INDEX0 - DEUX;
/* La valeur initiale correspond a une valeur a priori impossible... */
}
}
for (index=INDEX0 ; index<=LSTX(DIMENSION*DIMENSION) ; index++)
{
fonction_inverse_i[index] = INDEX0 - DEUX;
fonction_inverse_j[index] = INDEX0 - DEUX;
/* La valeur initiale correspond a une valeur a priori impossible... */
}
for (j=INDEX0 ; j<=LSTX(DIMENSION) ; j++)
{
for (i=INDEX0 ; i<=LSTX(DIMENSION) ; i++)
{
if ((i+j) <= LSTX(DIMENSION))
{
index=INDEX0 + FONCTION(i,j);
}
else
{
index=LSTX(DIMENSION*DIMENSION) - FONCTION(COMPLEMENT(i),COMPLEMENT(j));
}
if (fonction_directe[i][j] < INDEX0)
{
fonction_directe[i][j] = index;
/* Definition de la fonction directe. */
if ((fonction_inverse_i[index] < INDEX0) && (fonction_inverse_j[index] < INDEX0))
{
fonction_inverse_i[index] = i;
fonction_inverse_j[index] = j;
/* Definition de la fonction inverse. */
}
else
{
printf("\n la fonction inverse %04d --> {%04d,%04d}"
,index,fonction_inverse_i[index],fonction_inverse_j[index]
);
printf("\n est doublement definie ({%04d,%04d})"
,i,j
);
}
}
else
{
printf("\n la fonction directe {%04d,%04d} --> %04d est doublement definie (%04d)"
,i,j,fonction_directe[i][j],index
);
}
}
}
printf("\n fonction directe :\n");
for (j=INDEX0 ; j<=LSTX(DIMENSION) ; j++)
{
printf("\n");
for (i=INDEX0 ; i<=LSTX(DIMENSION) ; i++)
{
printf(" %04d",fonction_directe[i][j]);
}
printf("\n");
}
printf("\n fonction inverse :\n");
for (index=INDEX0 ; index<=LSTX(DIMENSION*DIMENSION) ; index++)
{
printf("\n %04d --> {%04d,%04d}",index,fonction_inverse_i[index],fonction_inverse_j[index]);
}
printf("\n");
}