Le détective Pikaptcha enquête sur une perturbation dans le continuum spacio-temporel. Il semblerait qu’un puissant poké-bot soit en train de déformer l’espace autour de notre héros pour le piéger. Aidez Pikaptcha à cartographier son environnement afin qu’il s'échappe et trouve le coupable !
Dans un premier temps je crée un tableau en 2D, puis je range les valeurs de l'input à l'intérieur.
Ensuite je viens faire un boucle sur le tableau 2D, afin de passer chaques élémens du tableau dans la fonction nbPossibiliti()
, cette fonction va me renvoyer le nombre de case vide autour de la case demandée. Enfin je print les valeurs renvoyées.
Dans un premier temps je crée un tableau en 2D, puis je range les valeurs de l'input à l'intérieur.
Ensuite je viens faire une premiere boucle afin de repérer les coordonée de la case de départ ainsi que sa rotations. Une fois fait je parcours le tableau 2D tant que Pika n'est pas sur son point de départ, dans cette boucle je vais appeller la fonction ProchaineDestination()
qui va me permettre de déplacer Pika sur la prochaine case:
Sur chaque déplacement la fonction ProchaineDestination()
va appeller la fonction Passage()
qui va permetre de marquer la case et ainsi savoir combien de fois Pika est passé dessus.
Enfin je fait une dernière boucle sur le tableau afin de print le tableau.
Les test de pikaptcha sont intéligeament imposé, ils vont vérifier si le code ne prends pas trop de temps à être exécuté, les tests crée des situations ou le PIKA est enfermé (pour tester ainsi toutes les possibilitées), ou encore lorsque le Pika est face contre un mur.
#include < stdlib.h >
#include < stdio.h >
#include < string.h >
typedef struct _pos {
int x;
int y;
} Pos;
Pos DIR[4] = { { 0, -1 }, { 1, 0 }, { 0, 1 }, { -1, 0 } };
int main()
{
int width;
int height;
scanf("%d%d", &width, &height);
int grid[width][height];
Pos start;
int dir = 0;
for (int y = 0; y < height; y++) {//Read input grid
char line[256];
scanf("%s", line);
for (int x = 0; x < width; x++) {
grid[x][y] = 0;
switch (line[x]) {
case '#':
grid[x][y] = -1;
break;
case '^':
dir = 0;
start.x = x;
start.y = y;
break;
case '>':
dir = 1;
start.x = x;
start.y = y;
break;
case 'v':
dir = 2;
start.x = x;
start.y = y;
break;
case '<':
dir = 3;
start.x = x;
start.y = y;
break;
}
}
}
char side[2];
scanf("%s", side);
int s = -1;
if (side[0] == 'R') {
s = 1;
}
Pos now = start, next = start;
int exit = 0;
while (!exit) {
dir+=s;
for(int i = 0; i < 4; i++) {
next = now;
if (dir < 0) {
dir += 4;
}
if (dir > 3) {
dir -= 4;
}
next.x = now.x + DIR[dir].x;
next.y = now.y + DIR[dir].y;
if(next.x >= 0 && next.x < width && next.y >= 0 && next.y < height){
if(grid[next.x][next.y] >= 0){
now = next;
grid[now.x][now.y]++;
break;
}
}
if(s > 0){
dir--;
}else{
dir++;
}
}
if(now.x == start.x && now.y == start.y){
exit = 1;
}
}
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
if (grid[x][y] < 0) {
printf("#");
} else {
printf("%d", grid[x][y]);
}
}
printf("\n");
}
return 0;
}
Mykeich utilise une class pour y renseigner la position de Pika, il ustilise aussi un tableau de tuple qui sera les coordonées des cases adjacente du Pika. Mykeich commence par chercher les murs qu'il renseignera comme -1 dans un tableau 2D, et la position de départ du Pika ainsi que sa rotation. Ensuite il boucle jusqu'à retrouver la position de départ. Puis il vient de façon astucieuse récupérer la position next grace à la position now + les coordonées de la direction actuelle remplis dans son tableau où il a renseigné les cases ajacentes. Puis, si la position next n'est pas la même que la position now alors il ajoute 1 à l'élément x, y de grid. Enfin Mykeich vient faire une derniere boucle pour renvoyer son tableau et reremplacer les chiffre négatif par des # (ceci lui a permis de ne pas générer d'erreurs lors de la vérification des cases adjacentes).