1
1
#include <stdio.h>
2
2
#include <stdlib.h>
3
- #include <stdbool.h>
4
3
#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 )
10
16
{
11
- int rows ;
12
- int cols ;
13
- char * letters ;
14
- } Grid ;
17
+ return 1 ;
18
+ }
15
19
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 )
18
33
{
19
34
// Si le mot est vide, c'est qu'il a été entièrement trouvé dans la grille
20
35
if (* word == '\0' )
21
- return true ;
36
+ return 1 ;
22
37
// 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
24
39
if (row < 0 || row >= grid -> rows || col < 0 || col >= grid -> cols )
25
- return false ;
40
+ return 0 ;
26
41
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
28
43
if (grid -> letters [row * grid -> cols + col ] != * word )
29
- return false ;
44
+ return 0 ;
30
45
31
46
// On marque la position actuelle comme visitée
32
47
char tmp = grid -> letters [row * grid -> cols + col ];
33
48
grid -> letters [row * grid -> cols + col ] = '*' ;
34
49
35
50
// 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 );
44
59
45
60
// On remet le caractère de la grille à sa valeur initiale
46
61
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
51
66
return found ;
52
67
}
53
68
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 )
55
74
{
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 &
73
75
for (int i = 0 ; i < strlen (word ); i ++ )
74
76
{
75
77
if (word [i ] == 'Q' && word [i + 1 ] == 'U' )
76
78
{
77
- word [i ] = '&' ;
78
- // shift the rest of the string
79
+ word [i ] = QU ;
79
80
for (int j = i + 1 ; j < strlen (word ); j ++ )
80
81
word [j ] = word [j + 1 ];
81
82
}
82
83
}
84
+ }
83
85
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
+ {
91
94
for (int i = 4 ; i < argc ; i ++ )
92
95
{
93
96
letters [i - 4 ] = argv [i ][0 ];
@@ -99,36 +102,94 @@ int main(int argc, char **argv)
99
102
}
100
103
letters [i - 4 ] = argv [i ][0 ];
101
104
}
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
+ }
107
106
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 )];
109
116
110
117
// 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 ++ )
113
119
{
114
- for (int j = 0 ; j < cols ; j ++ )
120
+ for (int j = 0 ; j < grid -> cols ; j ++ )
115
121
{
116
- if (findWordInGrid ( & grid , i , j , word , index_founded ))
122
+ if (grid_path_continue ( grid , i , j , word , found_positions ))
117
123
{
118
124
// 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 ;
121
130
}
122
131
}
123
132
}
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 ++ )
125
145
{
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
+ }
129
153
printf ("\n" );
130
154
}
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 );
131
192
132
- printf ( "%d" , ! found );
133
- return ! found ;
193
+
194
+ return result ;
134
195
}
0 commit comments