Codingame minimax exercise
Loading...
Searching...
No Matches
Classes | Typedefs | Enumerations | Functions
code.c File Reference
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <string.h>

Classes

struct  coord_s
 Structure de données pour une coordonnée. More...
 
struct  grid_s
 Structure de données pour une grille. More...
 
struct  element_s
 Structure de données pour un élément de pile ou de file contenant une coordonnée. More...
 
struct  stack_s
 Structure de données pour une pile (LIFO) More...
 
struct  queue_s
 Structure de données pour une file (FIFO) More...
 

Typedefs

typedef struct element_s element_s
 Structure de données pour un élément de pile ou de file contenant une coordonnée.
 

Enumerations

enum  {
  WALL = '#' , EMPTY = '.' , START = 'T' , COMMAND = 'C' ,
  UNKNOWN = '?' , UNEXPLORED = 'U' , EXPLORED = 'E' , SKIPPED = 'S' ,
  PLANNED = 'N'
}
 Constantes pour les caractères de la grille. More...
 

Functions

stack_screate_stack ()
 Crée une pile vide (LIFO)
 
void push_coordinate (stack_s *stack, int x, int y)
 Empile une coordonnée sur la pile.
 
coord_s pop (stack_s *stack)
 Dépile une coordonnée de la pile et la retourne.
 
size_t size (stack_s *stack)
 Retourne la taille de la pile (nombre d'éléments)
 
void free_stack (stack_s *stack)
 Libère la pile (et ses éléments)
 
queue_screate_queue ()
 Crée une file vide (FIFO)
 
void enqueue_coordinate (queue_s *queue, int x, int y)
 Enfile des coordonnées à la file (à la fin)
 
coord_s dequeue (queue_s *queue)
 Defile des coordonnées de la file et les retourne.
 
bool is_empty_q (queue_s *queue)
 Vérifie si la file est vide.
 
bool is_in_queue (queue_s *queue, int x, int y)
 Vérifie si des coordonnées sont dans la file.
 
void free_queue (queue_s *queue)
 Libère la file (et ses éléments)
 
bool is_valid (grid_s *grid, int x, int y)
 Vérifie si une coordonnée est valide (dans la grille)
 
bool is_next_to (int x, int y, int x2, int y2)
 Vérifie si deux coordonnées sont voisines (adjacentes) (pas en diagonale) et non égales.
 
void read_input (grid_s *grid, int *x, int *y)
 Lit l'entrée standard et modifie les coordonnées du joueur.
 
grid_screate_grid (int nb_rows, int nb_cols, char letter)
 Initialise une grille avec une lettre donnée.
 
coord_s found_char (grid_s *grid, char c)
 Recherche la position d'un caractère dans une grille.
 
bool is_useless (grid_s *grid, int x, int y)
 Indique si une case est inutile à explorer.
 
void free_grid (grid_s *grid)
 Libère une grille de lettres.
 
void free_int_grid (int **grid, int nb_rows)
 Libère une grille d'entiers.
 
stack_sdijkstra (grid_s *grid, int start_x, int start_y, int end_x, int end_y)
 Implémente l'algorithme de Dijkstra.
 
void direction (int actual_x, int actual_y, int x, int y)
 Renvoie dans quelle direction aller pour se rendre à une case.
 
void go_to (grid_s *grid, int *x, int *y, int end_x, int end_y)
 Va à une case de destination depuis la position actuelle du joueur en utilisant l'algorithme de Dijkstra.
 
int main ()
 Fonction principale.
 

Typedef Documentation

◆ element_s

typedef struct element_s element_s

Structure de données pour un élément de pile ou de file contenant une coordonnée.

Enumeration Type Documentation

◆ anonymous enum

anonymous enum

Constantes pour les caractères de la grille.

Enumerator
WALL 

Mur.

EMPTY 

Case vide.

START 

Case de départ et d'arrivée.

COMMAND 

Case de commande.

UNKNOWN 

Case inconnue (non découverte)

UNEXPLORED 

Case non explorée.

EXPLORED 

Case explorée.

SKIPPED 

Case ignorée (aucun intérêt d'explorer cette case)

PLANNED 

Case planifiée (à explorer)

Function Documentation

◆ create_grid()

grid_s * create_grid ( int  nb_rows,
int  nb_cols,
char  letter 
)

Initialise une grille avec une lettre donnée.

Parameters
nb_rowsLe nombre de lignes
nb_colsLe nombre de colonnes
letterLa lettre à mettre dans la grille
Returns
La grille nouvellement créée

◆ create_queue()

queue_s * create_queue ( )

Crée une file vide (FIFO)

Returns
La file nouvellement créée

◆ create_stack()

stack_s * create_stack ( )

Crée une pile vide (LIFO)

Returns
La pile nouvellement créée

◆ dequeue()

coord_s dequeue ( queue_s queue)

Defile des coordonnées de la file et les retourne.

Parameters
queueLa file sur laquelle defiler les coordonnées
Returns
Les coordonnées défilées

◆ dijkstra()

stack_s * dijkstra ( grid_s grid,
int  start_x,
int  start_y,
int  end_x,
int  end_y 
)

Implémente l'algorithme de Dijkstra.

L'algorithme de Dijkstra permet de trouver le plus court chemin entre deux points d'une grille.

See also
https://fr.wikipedia.org/wiki/Plus_court_chemin
https://fr.wikipedia.org/wiki/Algorithme_de_Dijkstra

La variable distances est un tableau d'entiers qui contient la distance entre le point de départ et chaque case de la grille (ou -1 si la case n'est pas accessible). La file contient les coordonnées des prochaines cases à calculer. La pile contient les coordonnées du chemin le plus court.

Si le chemin n'existe pas, la fonction renvoie NULL. Si le chemin existe, la fonction renvoie une pile contenant les coordonnées du chemin.

Note
Pour se déplacer, il faut dépiler la pile.
Warning
La pile doit être libérée avec la fonction free_stack.
Parameters
gridLa grille dans laquelle chercher le chemin
start_xLa coordonnée x de départ
start_yLa coordonnée y de départ
end_xLa coordonnée x de destination
end_yLa coordonnée y de destination
Returns
La pile contenant le chemin le plus court ou NULL si le chemin n'existe pas

◆ direction()

void direction ( int  actual_x,
int  actual_y,
int  x,
int  y 
)

Renvoie dans quelle direction aller pour se rendre à une case.

Parameters
actual_xLa coordonnée x de départ
actual_yLa coordonnée y de départ
xLa coordonnée x de destination
yLa coordonnée y de destination

◆ enqueue_coordinate()

void enqueue_coordinate ( queue_s queue,
int  x,
int  y 
)

Enfile des coordonnées à la file (à la fin)

Parameters
queueLa file sur laquelle ajouter les coordonnées
xLa coordonnée x
yLa coordonnée y

◆ found_char()

coord_s found_char ( grid_s grid,
char  c 
)

Recherche la position d'un caractère dans une grille.

La fonction parcourt la grille et renvoie la position du caractère. Si le caractère n'est pas trouvé, la fonction renvoie la position (-1, -1).

Parameters
gridLa grille à parcourir
cLe caractère à rechercher
Returns
La position du caractère dans la grille

◆ free_grid()

void free_grid ( grid_s grid)

Libère une grille de lettres.

Parameters
gridLa grille à libérer

◆ free_int_grid()

void free_int_grid ( int **  grid,
int  nb_rows 
)

Libère une grille d'entiers.

Parameters
gridLa grille à libérer
nb_rowsLe nombre de lignes de la grille

◆ free_queue()

void free_queue ( queue_s queue)

Libère la file (et ses éléments)

Parameters
queueLa file à libérer

◆ free_stack()

void free_stack ( stack_s stack)

Libère la pile (et ses éléments)

Parameters
stackLa pile à libérer

◆ go_to()

void go_to ( grid_s grid,
int *  x,
int *  y,
int  end_x,
int  end_y 
)

Va à une case de destination depuis la position actuelle du joueur en utilisant l'algorithme de Dijkstra.

La fonction trouve le plus court chemin entre la position actuelle et la case de destination. Elle déplace le joueur en suivant ce chemin et en lisant les entrées. La dernière case du chemin est la case d'arrivée passée en paramètre et elle n'est pas lue.

Note
La fonction ne vérifie pas si la case de destination est accessible.
See also
dijkstra
read_input
Parameters
gridLa grille dans laquelle se déplacer
xLa coordonnée x de la position actuelle du joueur
yLa coordonnée y de la position actuelle du joueur
end_xLa coordonnée x de la case de destination
end_yLa coordonnée y de la case de destination

◆ is_empty_q()

bool is_empty_q ( queue_s queue)

Vérifie si la file est vide.

Parameters
queueLa file à vérifier
Returns
true si la file est vide, false sinon

◆ is_in_queue()

bool is_in_queue ( queue_s queue,
int  x,
int  y 
)

Vérifie si des coordonnées sont dans la file.

Parameters
queueLa file à vérifier
xLa coordonnée x
yLa coordonnée y
Returns
true si les coordonnées sont dans la file, false sinon

◆ is_next_to()

bool is_next_to ( int  x,
int  y,
int  x2,
int  y2 
)

Vérifie si deux coordonnées sont voisines (adjacentes) (pas en diagonale) et non égales.

Parameters
xLa coordonnée x de la première coordonnée
yLa coordonnée y de la première coordonnée
x2La coordonnée x2 de la deuxième coordonnée
y2La coordonnée y2 de la deuxième coordonnée

◆ is_useless()

bool is_useless ( grid_s grid,
int  x,
int  y 
)

Indique si une case est inutile à explorer.

Une case est inutile à explorer si elle est entourée de murs ou de cases déjà visitées/connues.

Parameters
gridLa grille dans laquelle se trouve la case
visitedLa grille des cases visitées
xLa coordonnée x de la case
yLa coordonnée y de la case

◆ is_valid()

bool is_valid ( grid_s grid,
int  x,
int  y 
)

Vérifie si une coordonnée est valide (dans la grille)

Parameters
gridLa grille
xLa coordonnée x
yLa coordonnée y
Returns
true si la coordonnée est valide, false sinon

◆ main()

int main ( )

Fonction principale.

La fonction commence par lire les entrées et les stocker. Ensuite, elle explore la grille à la recherche de la salle de commande à l'aide d'une pile. Lorsque la salle de commande est trouvée et qu'il existe un chemin de la salle de commande à la position de départ en moins de rounds tours, on arrête l'exploration. On se déplace ensuite vers la salle de commande. Enfin, on retourne à la position de départ.

◆ pop()

coord_s pop ( stack_s stack)

Dépile une coordonnée de la pile et la retourne.

Parameters
stackLa pile sur laquelle dépiler
Returns
La coordonnée dépilée

◆ push_coordinate()

void push_coordinate ( stack_s stack,
int  x,
int  y 
)

Empile une coordonnée sur la pile.

Parameters
stackLa pile sur laquelle empiler les coordonnées
xLa coordonnée x
yLa coordonnée y

◆ read_input()

void read_input ( grid_s grid,
int *  x,
int *  y 
)

Lit l'entrée standard et modifie les coordonnées du joueur.

Parameters
gridLa grille
xLa coordonnée x du joueur
yLa coordonnée y du joueur

◆ size()

size_t size ( stack_s stack)

Retourne la taille de la pile (nombre d'éléments)

Parameters
stackLa pile dont on veut connaître la taille
Returns
La taille de la pile