Posté par
master_och master_och
Bonjour
suite à ce que j'ai posté dans ce lien

, et pour répondre à la demande de Rogerd je vais essayer d'expliquer les idées sur lesquels je me suis basé pour dire que la réalisation du programme est possible:
Avant tout je dois préciser que le language que j'utilise est le C++:
Pour commencer le programme la première chose qui vient à l'esprit c'est quels variables on doit utiliser pour représenter nos 4 figures, j'ai pensé donc à une class figure mais avant de definir ma class je vais expliquer quelques termes que j'utiliserai après:
une figure est l'assemblage de segments horizontaux et verticaux.
un segment est constitué de 2 points distincts
l'
origine d'une figure est le point le plus haut de la figure situé à gauche, à partir de ce point est du numéro de la figure notre class sera capable de dessiner la figure.
et voilà maintenant le corps de la class figure:
class figure {
point origine;/*point est une structure qui aura la forme suivante:
struct point{
int x;
int y;
}*/
segment seg[];
int nseg;
*/une figure sera un tableau de "nseg"segments, un segment est une structure definit ainsi:
struct segment{
point P1;/*point de départ*/
point P2;/*point final*/
}*/
public:
void figure(point orig,int num)
{origine=orig;
if(num==0){/*on prendra la figure jaune par exemple comme figure num0, tout ce qu'on a à faire c'est la dessiner*/
seg[0].P1=orig; seg[0].P2.x=orig.x + 1; seg[0].P2.y=orig.y;
seg[1].P1=seg[0].P2; seg[1].P2.x=seg[0].P2.x; seg[1].P2.y=seg[0].P2.y - 2;
.
.
.
/*jusqu'à arriver à seg[11]*/
seg[11].P1=seg[10].P2; seg[11].P2=orig;
nseg=12;}
else if(num==1){/*on dessine la figure bleu*/}
else if(num==2){/*on dessine la figure bleu en faisant une rotation de 90°*/}
else if(num==3){/*on dessine la figure bleu en faisant une rotation de 180°*/}
else if(num==4){/*on dessine la figure bleu en faisant une rotation de 270°°*/}
else if(num==5){/*on dessine la figure bleu en inversant la face*/}
.
.
else if(num==8){/*on dessine la figure bleu en inversant la face et en faisant une rotation 270°*/}
.
.
.
else if(num==32){/*on dessine la figure rouge en inversant la face et en faisant une rotation de 270°*/}
}/*et voilà le constructeur de figure est terminé*/
/*on pourra ajouter d'autres variables comme:
segment seghaut[] /*seghaut contiendra les segments horizontaux dirrigé vers le haut*/
segment segbas[]
segment segdroite[]
segment seggauch[]
/* ces variables seront peut être utiles dans notre boucle de recherche à la suite*/
/* on ajoutera aussi les variables suivant que j'expliquerai leur utilité aprés*/
point Ph;/*c'est le point le plus haut dans une figure donnée*/
/*de même*/ point Pb;point Pd;point Pg;
};
________________________
maintenant notre class figure est bien définit, il reste une class figcomp qui aura à peu près le corp suivant:
class figcomp{
point orig;
segment seg[]:
int nseg;
figure fig[];/*qui contiendra les figures présent dans figcomp*/
int nfig;/*le nbre de figures présent dans dans figcomp*/
int perimetre;
/*pui on fait declarer les extrémité de la figcomp tout comme on a fait dans ce qui précède*/
public:
void figcomp(){/*dans le constructeur on fait initialiser par la figure 0 dans le point origine (14,17)*/}
void ajout(figure fig1)
{/*on ajoute une figue pour la première fois, en fixant son origine dans une position bien déterminé dont on trouvera une formule, y aura une grande bataille la dessus

*/}
void tourne()
{/*cette fonction deplacera (voir tournera) la dernière figure ajouté dans la position suivante, cette fonction est aussi que celle qui la précède, voir un peu plus dur*/}
void suppr()
{/*cette fonction supprime une figure de la figcomp*/}
/*à chaque fois qu'on utilise une de ces fonction on met ajour nos variables privée*/
};
Les classes dont on a besoins sont définit il restera la boucle qui cherchera la solutions optimale qu'on sait déjà qu'elle est <=34, voici une idée sur les étapes de cette boucle:
1/On fixe L'origine de la figure 0 (jaune) dans le point (14,17)
2/On fait tourner une des
3 autres figure(pas la peine pour l'instant de faire une rotation de la figure ajouté ou de d'inverser sa face puisque la figure jaune et parfaitement symetrique)
3/On prend les 16 figures qui restes une par une, et on fait tourner chacune d'eux en partant de l'origine jusqu'à revenir à lui dans le sens d'une montre)
4/On prend les 8 figures qui restes une par une, et on fait tourner chacune d'eux autour de la figure composé en partant de l'origine jusqu'à revenir à lui dans le sens d'une montre.
Pour minimiser les calculs et éviter les répition, on pourra faire les tests suivants dans chaque étape à partir de l'étape 2:
-/supposant qu'on a utiliser la pièce 8 dans l'étape 2, et qu'on a teminer tout les cas possibles avec cette pièce, on passe alors à la pièce 9 dans l'étape 2, pour éviter les répitions, la pièce 8 ne doit en aucune étape qui suit avoir un contacte avec la pièce 0.
plus generalement: une pièce d'indice p qui est ajouté dans une étape n n'a pas le droit d'avoir un contact avec une pièces d'indices p'vérifiants les 2 conditions suivantes:
1)la pièce p' est ajouté dans une étape n' tel que n'< n-1
2)dans l'étape (n'+1) on a ajouté une pièce p1 tel que p1 > p.
Ces 2 conditions permetteront d'élliminer la répition des figures composés.
-/on calcul le périmetre minimal qui puisse être réalisé entre les extrémité de la figure composé en utilisant la formule suivante:
Per = (Pd.x-Ph.x)+(Ph.y-Pd.y) + (Pd.x-Pb.x)+(Pd.y-Pb.x) + (Pb.x-Pg.x)+(Pg.y-Pb.y) + (Ph.x-Pg.x)+(Ph.y-Pg.y)
si (Per>34) pa la peine de passer à l'étape suivante, il faut passer au cas suivant dans l'étape actuelle.
-/ enfin si on est dans la dernière étape on calcule le perimetre si jamais on trouve une disposition permettant de trouver un pèrimetre<34 (ce qui me surprendra) on l'affiche.Pour calculé le perimetre il suffit d'ajouter le peimetre de la figur ajouté à la figure composé - 2*la longueur des segments communs.
voici à peu près mon idée sur le programme qui malgré qu'il soit très compliqué me parait réalisable.
En tout cas comme je l'ai déjà dit dès que les vacances arrivent j'essayerai de le réaliser et je vous tiendrai au courant

,.