|
Codingame minimax exercise
|
#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_s * | create_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_s * | create_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_s * | create_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_s * | dijkstra (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. | |
Structure de données pour un élément de pile ou de file contenant une coordonnée.
| anonymous enum |
Constantes pour les caractères de la grille.
| grid_s * create_grid | ( | int | nb_rows, |
| int | nb_cols, | ||
| char | letter | ||
| ) |
Initialise une grille avec une lettre donnée.
| nb_rows | Le nombre de lignes |
| nb_cols | Le nombre de colonnes |
| letter | La lettre à mettre dans la grille |
| queue_s * create_queue | ( | ) |
Crée une file vide (FIFO)
| stack_s * create_stack | ( | ) |
Crée une pile vide (LIFO)
Defile des coordonnées de la file et les retourne.
| queue | La file sur laquelle defiler les coordonnées |
Implémente l'algorithme de Dijkstra.
L'algorithme de Dijkstra permet de trouver le plus court chemin entre deux points d'une grille.
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.
| grid | La grille dans laquelle chercher le chemin |
| start_x | La coordonnée x de départ |
| start_y | La coordonnée y de départ |
| end_x | La coordonnée x de destination |
| end_y | La coordonnée y de destination |
| void direction | ( | int | actual_x, |
| int | actual_y, | ||
| int | x, | ||
| int | y | ||
| ) |
Renvoie dans quelle direction aller pour se rendre à une case.
| actual_x | La coordonnée x de départ |
| actual_y | La coordonnée y de départ |
| x | La coordonnée x de destination |
| y | La coordonnée y de destination |
| void enqueue_coordinate | ( | queue_s * | queue, |
| int | x, | ||
| int | y | ||
| ) |
Enfile des coordonnées à la file (à la fin)
| queue | La file sur laquelle ajouter les coordonnées |
| x | La coordonnée x |
| y | La coordonnée y |
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).
| grid | La grille à parcourir |
| c | Le caractère à rechercher |
| void free_grid | ( | grid_s * | grid | ) |
Libère une grille de lettres.
| grid | La grille à libérer |
| void free_int_grid | ( | int ** | grid, |
| int | nb_rows | ||
| ) |
Libère une grille d'entiers.
| grid | La grille à libérer |
| nb_rows | Le nombre de lignes de la grille |
| void free_queue | ( | queue_s * | queue | ) |
Libère la file (et ses éléments)
| queue | La file à libérer |
| void free_stack | ( | stack_s * | stack | ) |
Libère la pile (et ses éléments)
| stack | La pile à libérer |
| 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.
| grid | La grille dans laquelle se déplacer |
| x | La coordonnée x de la position actuelle du joueur |
| y | La coordonnée y de la position actuelle du joueur |
| end_x | La coordonnée x de la case de destination |
| end_y | La coordonnée y de la case de destination |
| bool is_empty_q | ( | queue_s * | queue | ) |
Vérifie si la file est vide.
| queue | La file à vérifier |
| bool is_in_queue | ( | queue_s * | queue, |
| int | x, | ||
| int | y | ||
| ) |
Vérifie si des coordonnées sont dans la file.
| queue | La file à vérifier |
| x | La coordonnée x |
| y | La coordonnée y |
| 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.
| x | La coordonnée x de la première coordonnée |
| y | La coordonnée y de la première coordonnée |
| x2 | La coordonnée x2 de la deuxième coordonnée |
| y2 | La coordonnée y2 de la deuxième coordonnée |
| 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.
| grid | La grille dans laquelle se trouve la case |
| visited | La grille des cases visitées |
| x | La coordonnée x de la case |
| y | La coordonnée y de la case |
| bool is_valid | ( | grid_s * | grid, |
| int | x, | ||
| int | y | ||
| ) |
Vérifie si une coordonnée est valide (dans la grille)
| grid | La grille |
| x | La coordonnée x |
| y | La coordonnée y |
| 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.
Dépile une coordonnée de la pile et la retourne.
| stack | La pile sur laquelle dépiler |
| void push_coordinate | ( | stack_s * | stack, |
| int | x, | ||
| int | y | ||
| ) |
Empile une coordonnée sur la pile.
| stack | La pile sur laquelle empiler les coordonnées |
| x | La coordonnée x |
| y | La coordonnée y |
| void read_input | ( | grid_s * | grid, |
| int * | x, | ||
| int * | y | ||
| ) |
Lit l'entrée standard et modifie les coordonnées du joueur.
| grid | La grille |
| x | La coordonnée x du joueur |
| y | La coordonnée y du joueur |
| size_t size | ( | stack_s * | stack | ) |
Retourne la taille de la pile (nombre d'éléments)
| stack | La pile dont on veut connaître la taille |