Skip to content

Commit 91db469

Browse files
committed
docs et meilleure grid path
1 parent c44ef12 commit 91db469

File tree

2 files changed

+146
-72
lines changed

2 files changed

+146
-72
lines changed

server/dictionnary/src/grid_path.c

Lines changed: 131 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,61 @@
11
#include <stdio.h>
22
#include <stdlib.h>
3-
#include <stdbool.h>
43
#include <string.h>
5-
6-
#define MAX_WORD_LENGTH 100
7-
8-
// Définition de la structure de données représentant la grille de caractères
9-
typedef struct
4+
#include "include/grid_path.h"
5+
#include "include/libs.h"
6+
7+
/**
8+
* @brief Vérifie si une position est dans la grille
9+
* @param Grid *grid - La structure grille à vérifier
10+
* @param int i - La position verticale
11+
* @param int j - La position horizontale
12+
* @return 1 si la position est dans la grille, 0 sinon
13+
*
14+
*/
15+
int checkBounds(Grid *grid, int i, int j)
1016
{
11-
int rows;
12-
int cols;
13-
char *letters;
14-
} Grid;
17+
return 1;
18+
}
1519

16-
// Fonction de vérification récursive de la présence du mot dans la grille
17-
bool findWordInGrid(Grid *grid, int row, int col, const char *word, int *index_founded)
20+
/**
21+
* @brief Cherche récursivement si un mot est dans la grille
22+
* @details Regarde les voisins diagonaux et adjacents de la position donnée jusqu'à avoir trouvé le mot ou si toutes les cases sont épuisée
23+
* @param Grid *grid - Structure de la grille à chercher
24+
* @param int row - Ligne de la position initiale à chercher
25+
* @param int col - Colonne de la position initiale à chercher
26+
* @param char *word - Mot à chercher
27+
* @param int *found_positions - Liste des positions déjà trouvées de taille = à strlen(word)
28+
* @return int 0 si le mot a été trouvé, 1 sinon
29+
*
30+
*
31+
* **/
32+
int grid_path_continue(Grid *grid, int row, int col, const char *word, int *index_founded)
1833
{
1934
// Si le mot est vide, c'est qu'il a été entièrement trouvé dans la grille
2035
if (*word == '\0')
21-
return true;
36+
return 1;
2237
// printf("%s ", word);
23-
// Si la position actuelle est en dehors de la grille, on retourne false
38+
// Si la position actuelle est en dehors de la grille, on retourne 0
2439
if (row < 0 || row >= grid->rows || col < 0 || col >= grid->cols)
25-
return false;
40+
return 0;
2641

27-
// Si le caractère de la grille ne correspond pas à celui du mot, on retourne false
42+
// Si le caractère de la grille ne correspond pas à celui du mot, on retourne 0
2843
if (grid->letters[row * grid->cols + col] != *word)
29-
return false;
44+
return 0;
3045

3146
// On marque la position actuelle comme visitée
3247
char tmp = grid->letters[row * grid->cols + col];
3348
grid->letters[row * grid->cols + col] = '*';
3449

3550
// On vérifie récursivement les positions adjacentes et diagonales
36-
bool found = findWordInGrid(grid, row + 1, col, word + 1, index_founded) ||
37-
findWordInGrid(grid, row - 1, col, word + 1, index_founded) ||
38-
findWordInGrid(grid, row, col + 1, word + 1, index_founded) ||
39-
findWordInGrid(grid, row, col - 1, word + 1, index_founded) ||
40-
findWordInGrid(grid, row + 1, col + 1, word + 1, index_founded) ||
41-
findWordInGrid(grid, row - 1, col - 1, word + 1, index_founded) ||
42-
findWordInGrid(grid, row + 1, col - 1, word + 1, index_founded) ||
43-
findWordInGrid(grid, row - 1, col + 1, word + 1, index_founded);
51+
int found = grid_path_continue(grid, row + 1, col, word + 1, index_founded) ||
52+
grid_path_continue(grid, row - 1, col, word + 1, index_founded) ||
53+
grid_path_continue(grid, row, col + 1, word + 1, index_founded) ||
54+
grid_path_continue(grid, row, col - 1, word + 1, index_founded) ||
55+
grid_path_continue(grid, row + 1, col + 1, word + 1, index_founded) ||
56+
grid_path_continue(grid, row - 1, col - 1, word + 1, index_founded) ||
57+
grid_path_continue(grid, row + 1, col - 1, word + 1, index_founded) ||
58+
grid_path_continue(grid, row - 1, col + 1, word + 1, index_founded);
4459

4560
// On remet le caractère de la grille à sa valeur initiale
4661
grid->letters[row * grid->cols + col] = tmp;
@@ -51,43 +66,31 @@ bool findWordInGrid(Grid *grid, int row, int col, const char *word, int *index_f
5166
return found;
5267
}
5368

54-
int main(int argc, char **argv)
69+
/**
70+
*@brief Change tous les 'QU' par un caractère spécial et décale les caractères suivants
71+
*@param char *word - Mot à nettoyer
72+
**/
73+
void cleanWord(char *word)
5574
{
56-
// Vérification du nombre d'arguments
57-
if (argc < 5)
58-
{
59-
printf("Usage: %s <mot> <nombre de lignes> <nombre de colonnes> <grille>\n", argv[0]);
60-
return 1;
61-
}
62-
63-
// Vérification de la longueur du mot
64-
if (strlen(argv[1]) > MAX_WORD_LENGTH)
65-
{
66-
printf("Le mot ne doit pas dépasser %d caractères\n", MAX_WORD_LENGTH);
67-
return 1;
68-
}
69-
70-
// Récupération des arguments
71-
char *word = argv[1];
72-
// replace in word all QU by &
7375
for (int i = 0; i < strlen(word); i++)
7476
{
7577
if (word[i] == 'Q' && word[i + 1] == 'U')
7678
{
77-
word[i] = '&';
78-
// shift the rest of the string
79+
word[i] = QU;
7980
for (int j = i + 1; j < strlen(word); j++)
8081
word[j] = word[j + 1];
8182
}
8283
}
84+
}
8385

84-
int rows = atoi(argv[2]);
85-
int cols = atoi(argv[3]);
86-
Grid grid;
87-
grid.rows = rows;
88-
grid.cols = cols;
89-
grid.letters = malloc(rows * cols * sizeof(char));
90-
char letters[argc - 4];
86+
/**
87+
*@brief Change tous les 'QU' par un caractère spécial dans la grille
88+
*@param int argc - Nombre d'arguments
89+
*@param char **argv - Arguments
90+
*@param char *letters - Tableau de caractères à remplir
91+
**/
92+
void cleanGrid(int argc, char **argv, char *letters)
93+
{
9194
for (int i = 4; i < argc; i++)
9295
{
9396
letters[i - 4] = argv[i][0];
@@ -99,36 +102,94 @@ int main(int argc, char **argv)
99102
}
100103
letters[i - 4] = argv[i][0];
101104
}
102-
strcpy(grid.letters, letters);
103-
// Affichage de la grille
104-
// printf("Grille de %d lignes et %d colonnes: ", rows, cols);
105-
// for (size_t i = 0; i < rows*cols; i++)
106-
// printf("%c ", grid.letters[i]);
105+
}
107106

108-
int index_founded[strlen(word)];
107+
/**
108+
* @brief Cherche un mot dans la grille et affiche les positions dans l'ordre
109+
* @param char *word - Mot à chercher
110+
* @param Grid *grid - Structure de la grille à chercher
111+
* @return int 0 si le mot a été trouvé, 1 sinon
112+
**/
113+
int grid_path(char *word, Grid *grid)
114+
{
115+
int found_positions[strlen(word)];
109116

110117
// Recherche du mot dans la grille
111-
bool found = false;
112-
for (int i = 0; i < rows; i++)
118+
for (int i = 0; i < grid->rows; i++)
113119
{
114-
for (int j = 0; j < cols; j++)
120+
for (int j = 0; j < grid->cols; j++)
115121
{
116-
if (findWordInGrid(&grid, i, j, word, index_founded))
122+
if (grid_path_continue(grid, i, j, word, found_positions))
117123
{
118124
// printf("Mot trouvé en commençant par la position (%d, %d)\n", i, j);
119-
found = true;
120-
break;
125+
// on a trouvé alors on affiche les positions dans le l'ordre (donc ordre inverse de la liste)
126+
for (int i = strlen(word) - 1; i >= 0; i--)
127+
printf("%d ", found_positions[i]);
128+
printf("\n");
129+
return FOUND;
121130
}
122131
}
123132
}
124-
if (found)
133+
134+
return NOT_FOUND;
135+
}
136+
137+
/**
138+
* @brief Affiche la grille
139+
* @param Grid *grid - Structure de la grille à afficher
140+
**/
141+
void printGrid(Grid *grid)
142+
{
143+
printf("Grille de %d lignes et %d colonnes:\n", grid->rows, grid->cols);
144+
for (size_t i = 0; i < grid->cols; i++)
125145
{
126-
// Afficher les index des lettres du mot
127-
for (int i = strlen(word) - 1; i >= 0; i--)
128-
printf("%d ", index_founded[i]);
146+
for (size_t j = 0; j < grid->rows; j++)
147+
{
148+
if (grid->letters[i * grid->cols + j] == QU)
149+
printf("QU ");
150+
else
151+
printf("%c ", grid->letters[i * grid->cols + j]);
152+
}
129153
printf("\n");
130154
}
155+
}
156+
157+
int main(int argc, char **argv)
158+
{
159+
// Vérification du nombre d'arguments
160+
if (argc < 5)
161+
{
162+
printf("Usage: %s <mot> <nombre de lignes> <nombre de colonnes> <grille>\n", argv[0]);
163+
return MISSING_PARAMS;
164+
}
165+
166+
Grid grid;
167+
// Récupération des arguments
168+
grid.rows = atoi(argv[2]);
169+
grid.cols = atoi(argv[3]);
170+
grid.size = grid.rows * grid.cols;
171+
grid.letters = malloc(grid.size * sizeof(char));
172+
char *word = argv[1];
173+
// On remplace les QU par un caractère spécial
174+
cleanWord(word);
175+
// Vérification de la longueur du mot
176+
if (strlen(word) > grid.size)
177+
{
178+
printf("Le mot ne doit pas dépasser %d caractères\n", grid.size);
179+
return WRONG_PARAMS;
180+
}
181+
182+
// printf("Mot à chercher: %s\n", word);
183+
char letters[argc - 4];
184+
// On fait pareil pour la grille
185+
186+
cleanGrid(argc, argv, letters);
187+
strcpy(grid.letters, letters); // On met le résultat dans la struct
188+
// printGrid(&grid);
189+
int result = grid_path(word, &grid);
190+
free(grid.letters);
191+
printf("%d", result);
131192

132-
printf("%d", !found);
133-
return !found;
193+
194+
return result;
134195
}
Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,19 @@
11
#include <stdlib.h>
22
#include <stdio.h>
33

4-
char **create_matrix(int num_lines, int num_columns, char **lettres);
54

6-
int grid_path(char word[], int num_lines, int num_columns, char lettres[]);
5+
#define QU '&'
6+
#define VISITED '@'
7+
#define FOUND 0
8+
#define NOT_FOUND 1
9+
// Définition de la structure de données représentant la grille de caractères
10+
11+
typedef struct
12+
{
13+
int rows;
14+
int cols;
15+
char *letters;
16+
int size;
17+
} Grid;
18+
19+
int grid_path(char *word, Grid *grid);

0 commit comments

Comments
 (0)