/*************************************************************************************************************************************/
/* */
/* E N I G M E ( 'v $Dcourrier_in/20000523145250 obac@aemiaif.lip6.fr' ) : */
/* */
/* */
/* Author of '$xtc/PlotPions.01$c' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, AAAAMMJJhhmmss). */
/* */
/*************************************************************************************************************************************/
#include <stdio.h>
#include <math.h>
#define FAUX 0
#define VRAI 1
#define PREMIER 1
#define nPLOTS 8
#define nPIONS 6
#define acces(t,i) \
t[(i)-PREMIER]
#define dPLOTS(n,e) \
{ \
if (((n) >= PREMIER) && ((n) <= nPLOTS)) \
{ \
acces(plots_occupes,n)=e; \
} \
else \
{ \
printf("\nle plot %d est inexistant dans [%d,%d]\n",n,PREMIER,nPLOTS); \
} \
}
static int plots_occupes[nPLOTS];
static int hauteur_des_tours[nPLOTS];
static int nombre_de_configurations;
void recursif(plot_courant,plus_haute_tour)
int plot_courant;
int plus_haute_tour;
{
int plot,tour;
int sauve=acces(hauteur_des_tours,plot_courant);
int hauteur=((acces(plots_occupes,plot_courant) == VRAI) ? plus_haute_tour : PREMIER);
for (tour=PREMIER ; tour<=hauteur ; tour++)
/* Avec cette boucle, on essaye tous les empilements possibles de pions sur le plot courant */
/* (a condition qu'il puisse etre occupe). */
{
if (acces(plots_occupes,plot_courant) == VRAI)
{
acces(hauteur_des_tours,plot_courant)++;
/* Empilement des pions lorsque le plot courant peut etre occupe. */
}
else
{
}
if (plot_courant < nPLOTS)
{
recursif(plot_courant+1,plus_haute_tour);
/* Allons faire recursivement la meme operation d'empilement sur le plot suivant, tant */
/* qu'il y a un suivant.... */
}
else
{
int longueur=0;
for (plot=PREMIER ; plot<=nPLOTS ; plot++)
{
longueur=longueur+acces(hauteur_des_tours,plot);
/* Calcul du nombre de pions utilises dans la configuration courante d'occupation des plots. */
}
if (longueur == nPIONS)
{
int tour;
nombre_de_configurations++;
/* Comptage des configurations possibles rencontrees... */
for (tour=plus_haute_tour ; tour>=(PREMIER-1) ; tour--)
{
printf("\n");
for (plot=PREMIER ; plot<=nPLOTS ; plot++)
{
if (tour > acces(hauteur_des_tours,plot))
{
printf(" ");
}
else
{
if (tour >= PREMIER)
{
printf("+ ");
}
else
{
printf("- ");
}
}
}
}
printf("\n");
for (plot=PREMIER ; plot<=nPLOTS ; plot++)
{
printf("%d ",acces(hauteur_des_tours,plot));
/* Cas ou le nombre de pions utilises dans la configuration courante est egal au nombre */
/* de pions disponibles. */
}
printf("\n");
}
else
{
}
}
}
acces(hauteur_des_tours,plot_courant)=sauve;
}
void recherche_des_configurations_possibles()
{
int plot;
int nombre_de_plots_occupes;
int plus_haute_tour;
nombre_de_plots_occupes=0;
for (plot=PREMIER ; plot<=nPLOTS ; plot++)
{
acces(hauteur_des_tours,plot)=0;
if (acces(plots_occupes,plot) == VRAI)
{
nombre_de_plots_occupes++;
}
else
{
}
}
plus_haute_tour=(nPIONS%nombre_de_plots_occupes)+1;
/* Plus haute tour de pions possible etant donne le nombre de plots pouvant etre occupes */
/* et le nombre de pions... */
printf("plus haute tour : %d\n",plus_haute_tour);
nombre_de_configurations=0;
/* Comptage des configurations possibles rencontrees... */
recursif(PREMIER,plus_haute_tour);
/* Exploration de toutes les configurations possibles d'empilement de pions en chaque plot */
/* en partant du premier plot... */
printf("\nnombre de configurations possibles : %d",nombre_de_configurations);
printf("\n");
}
main()
{
dPLOTS(1,FAUX);
dPLOTS(2,FAUX);
dPLOTS(3,VRAI);
dPLOTS(4,VRAI);
dPLOTS(5,FAUX);
dPLOTS(6,VRAI);
dPLOTS(7,VRAI);
dPLOTS(8,FAUX);
/* Definition (arbitraire) de la configuration initiale. */
recherche_des_configurations_possibles();
/* Recherche des configurations possibles pour la configuration initiale. */
printf("\n\n");
dPLOTS(1,FAUX);
dPLOTS(2,VRAI);
dPLOTS(3,FAUX);
dPLOTS(4,FAUX);
dPLOTS(5,VRAI);
dPLOTS(6,VRAI);
dPLOTS(7,VRAI);
dPLOTS(8,VRAI);
/* Definition (arbitraire) de la configuration initiale. */
recherche_des_configurations_possibles();
/* Recherche des configurations possibles pour la configuration initiale. */
printf("\n\n");
dPLOTS(1,VRAI);
dPLOTS(2,VRAI);
dPLOTS(3,VRAI);
dPLOTS(4,VRAI);
dPLOTS(5,VRAI);
dPLOTS(6,FAUX);
dPLOTS(7,VRAI);
dPLOTS(8,FAUX);
/* Definition (arbitraire) de la configuration initiale. */
recherche_des_configurations_possibles();
/* Recherche des configurations possibles pour la configuration initiale. */
}