GHOST LEGS

Cyprein JULLIEN PREPA ISIMA UCA

Tronix

ghost

Introduction

Ghost Legs est une sorte de jeu de loterie courant en Asie. Cela commence par un certain nombre de lignes verticales. Entre les lignes se trouvent des connecteurs horizontaux aléatoires reliant toutes les lignes dans un diagramme connecté, comme celui ci-dessous.

    A  B  C
    |  |  |
    |--|  |
    |  |--|
    |  |--|
    |  |  |
    1  2  3

But:

Le but de l’exercice est de coder un programe en C, qui permet de donner les liens entre chaques lettres et numéros avec un diagramme aléatoire.

Description synoptique de ma méthode de résolution

Voici mon code en C:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>

int pos(int tab[],int max,int recherche)
{
    // Ceci est une fonction pour retrouver la position de la référence du départ dans le tableau EnCours
    for(int n=0;n<max;n++)
    {
        if(recherche==tab[n])
        {
            return n;
        }
    }
    return -1;
}


int main()
{
    int W;
    int H;
    scanf("%d%d", &W, &H); fgetc(stdin);
    char tab[W*H];

    //j'initialise mes 3 tableaux
    // Debut pour les lettres
    // Fin pour les numéros en bas de diagramme
    // EnCours pour les numéros associé aux lettres
    // Je prends donc la largeur/3 +1 afin de couvrir toutes les grandeurs de diagramme possible;

    char Debut[(W/3)+1];
    char Fin[(W/3)+1];
    int EnCours[(W/3)+1];

    
    for (int i = 0; i < H; i++) {
        char line[1025];
        scanf("%[^\n]", line); fgetc(stdin);

        //Lors du premier tour je viens rentrer mes premiers valeur dans Debut et EnCours
        if(i==0){
            int tmp=0;
            for(int y=0;y<W;y+=3)
            {
               Debut[tmp]=line[y];
               EnCours[tmp]= tmp;
               tmp++;
               
            }
           
           
        }
        //Lors du dernier tour je viens rentrer mes premiers valeur dans Fin, je trouve le dernier tour en faisant la hauteur -1
        else if(i==H-1){
            int tmp=0;
            for(int y=0;y<W;y+=3)
            {
               Fin[tmp]=line[y];
               tmp++;
            }
            
        }
        else
        {
            //ici j'échange la position dans le tableau EnCours lorsqu'on trouve un caractère '-'
            // je prends donc la position actuel et la position +1 su tableau en cour qui correspondent aux colonnes reliées
            int tmp=0;
            for(int y=1;y<=W;y+=3)
            {
               if(line[y]=='-')
               {
                    int valeurTemporaire;
                    valeurTemporaire=EnCours[tmp];
                    EnCours[tmp]=EnCours[tmp+1];
                    EnCours[tmp+1]=valeurTemporaire;
               
               }
               tmp++;
            }
        }
    }

    
    int tmp=0;
    // je boucle sur le nombre de numéro en indentant de 3 pour chaque colonnes
    for(int y=0;y<W;y+=3)
    {
        //enfin je print le numéro et le chiffre dans le bon ordre grace à la fonction pos() qui me permet de déterminer la bonne position des lettres et des numéros placé dans les tableaux Debut et Fin 
        printf("%c%c\n",Debut[EnCours[pos(EnCours,(W/3)+1,tmp)]], Fin[pos(EnCours,(W/3)+1,tmp)]);
        tmp++;
    }
    
    return 0;

}

Analyse des résultats

Le programme fonction bien et donne les bonnes pairs de solutions

Autre solutions

Dans la solution de LloydKM, il utilise un tableau à deux dimensions pour stocker le diagramme, puis il vient le parcourir pour chaques baranches et fait donc du cas par cas. J’ai aprécié le fait de voir que nous n’avons pas la même approche, et la façon dont LloydKM print les réponses avant et après calculs.

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>


static const int OFFSET = 1;
static const int LINE_END = 2;
static const int RIGHT_PATH = 1;
static const int LEFT_PATH = -1;

int main()
{
    int W;
    int H;
    scanf("%d%d", &W, &H); fgetc(stdin);

    // store ghost leg game in 2D-Array
    char ghost_leg[H][W + LINE_END];
    for (int i = 0; i < H; i++) {
        fgets(&ghost_leg[i][0], W + LINE_END, stdin);
    }
    
    //go through each starting point and follow the legs
    for (int i = 0; i < W; i += 3) {
        int rel_lane = 0;
        printf("%c", ghost_leg[0][i]);
        for (int j = 1; j < H; j++) {
            //case if you're lefmost
            if(i + rel_lane == 0 && ghost_leg[j][RIGHT_PATH] == '-'){
                rel_lane += 3;
            }
            //case if you're rightmost
            else if (i + rel_lane == W && ghost_leg[j][W + LEFT_PATH] == '-'){
                rel_lane -=3;
            }
            //case in between
            else {
                if (ghost_leg[j][i + rel_lane + RIGHT_PATH] == '-') rel_lane += 3;
                else if (ghost_leg[j][i + rel_lane + LEFT_PATH] == '-') rel_lane -= 3;
            }
        }
        printf("%c\n", ghost_leg[H - OFFSET][i + rel_lane]);
    }

    return 0;
}

Solution de LloydKM

Bilan

Il est toujours bon de regarder plusieurs points de vue sur un même problème, plusieurs méthodes de résolutions. Enfin j’ai appris à manipuler des tableaux de manière efficace en c, et je me suis rendu compte à quel point faire un dessin du problème peut aider à le résoudre.

retour au Hub