Lumen
Table of Contents
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); }