Lumen

Table of Contents

UCA.png

LA-QUESTION-SEXO-Faut-il-mieux-faire-l-amour-la-lumiere-eteinte-ou-allumee.jpg

1. Doxygene

2. Introduction Lumen

ILS vous mettent dans une pièce de forme carrée, avec N mètres de chaque côté. ILS veulent tout savoir de vous. ILS vous observent. ILS ont placé des bougies dans la pièce.

Chaque bougie fait “lumière” L à l’endroit où elle se trouve, et chaque spot de forme carrée reçoit une “lumière” de moins que les suivants. Si un endroit est touché par deux bougies, il aura la plus grande « lumière » possible. Chaque spot a la lumière de base de 0.

Vous ne pouvez vous cacher que si vous trouvez une tache sombre qui a 0 “lumière”. Combien de zones d’ombres as-tu ?

3. Solution expliquée

Pour cette exercice, je crée un tableau qui represente la pièce, 0 vaut une zone non éclairé et 1 une zone éclairé. Avec le scanf() de la grille, je viens détecter l’orsqu’une bougie à été placé, si une bougie à été détecter alors je fait appel a ma fonction addTab. cette fonction va faire une double boucle sur l’emplacement de la bougie et la longeur de l’éclairage d’une bougie, puis va remplacer tout les 0 par des 1 dans la zone d’éclairage de la bougie. Si une autre bougie à été trouvé alors on répete l’opération en prenant la même grille, ceci nous permet d’obtenir un plan de la pièce avec les zones éclairées et les zones non éclairées. Enfin on compte le nombre de 0 présent dans la grille.

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

#define M 25

void addTab(int referenceTab[M][M],int centerX1,int centerY1,int N,int L)
{
    for (int i = centerX1-L+1; i < centerX1+L; i++) {
        for (int j = centerY1-L+1; j < centerY1+L; j++) {
            if(i>=0 && j>=0 && i<N && j<N)
            {
                referenceTab[i][j]+=1;
            }
        }
    }
}

int main()
{
  //initialisation du tableau
    int tab[M][M];
      for (int i = 0; i < M; i++) {
        for (int j = 0; j < M; j++) {
            tab[i][j] = 0;
        }
    }
    int N;
    int result =0;

    scanf("%d", &N);
    int L;
    scanf("%d", &L);
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            char cell[4];
            scanf("%s", cell);
            if(strcmp(cell,"C")==0)
            {
                addTab(tab,i,j,N,L);
            }

        }
    }
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
             if(tab[i][j]==0)
             {
                result++;
             }
        }
    }
    printf("%d\n",result);

    return 0;
}

4. Tests et exécutions

4.1. THEY only have one candle

Test avec comme entrées

gcc -Wextra -Wall -Werror Lumen.c
./a.out
5
3
X X X X X
X C X X X
X X X X X
X X X X X
X X X X X

voici le résultat:

9

4.2. THEY have a medium cellar

Test avec comme entrées

gcc -Wextra -Wall -Werror Lumen.c
./a.out
15
3
X X X X X X X X X X X X C X X
X X X X X X X X X X X X C X X
X X X X X X X X X C X X X X X
X X X X X C X X X X X X X X X
X X X X C X X X X X X X X X X
C X X X X X X X C X X C X X X
X X X X X C X X X X X X X X C
X C X X X X X X X X X X X X X
X X X X X X X C X C X X X X X
X X X X X X X X X X X X C X X
X X X X X X X X X X X X X X X
X X C X C X X X X X X X X X C
X X X X X X C X X X C X X X X
X C X X X X X X X X X X X X X
X X X X X X X X X X X X X X X

Voici le résultat:

14

5. solutions de la communauté

Alain-Delpuch dans son programme, il utilise une fonction récursive afin de remplir son tableau, il utilise 8 appelles dans chaques directions de la bougie. Puis il compte simplement le nombre de 0 présent dans la grille.

// ------------------------------------------------------------------
//                                                              Lumen
// ------------------------------------------------------------------

#include <stdio.h>
// ------------------------------------------------------------------
int map[25][25];
int N,L;
// ------------------------------------------------------------------
void
F(unsigned  int i, unsigned int j, int l){
    if ( i >= N || j >= N || l < map[i][j] ) return;
    map[i][j] = l--;
    F( i-1 , j-1 , l) ; F( i-1 , j   , l) ; F( i-1 , j+1 , l) ;
    F( i   , j-1 , l) ;                   ; F( i   , j+1 , l) ;
    F( i+1 , j-1 , l) ; F( i+1 , j   , l) ; F( i+1 , j+1 , l) ;
}
// ------------------------------------------------------------------
main() {
    scanf("%d %d\n", &N, &L);
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            char buf[2];
            scanf("%s",buf);
            F( i , j , *buf=='X' ? 0 : L);
        }
    }
    int result = 0;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            result += map[i][j] == 0;
        }
    }
    printf("%d",result);
}

Code de Alain-Delpuch

retour au Hub

Date: 2024-05-01

Author: CyprienJULLIEN

Created: 2024-05-02 jeu. 09:21