-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathverifications.c
More file actions
executable file
·144 lines (120 loc) · 4.24 KB
/
verifications.c
File metadata and controls
executable file
·144 lines (120 loc) · 4.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include <stdio.h>
#include <stdlib.h>
#include "structures.h"
#include "verifications.h"
#include "resoudre.h"
#include "fichiers.h"
#include "generer.h"
/* Cette fonction vérifie si une case de coordonnées (i;j) peut prendre la valeur n */
int verif_case(int grille[9][9], int n, int i, int j)
{
int i_case, j_case, k, l;
/* On se place dans la case du coin superieur droit du carré de 3x3 qui contient la case (i;j) */
if (i < 3) {i_case = 0;}
else if (i < 6 && i >= 3) {i_case = 3;}
else {i_case = 6;}
if (j < 3) {j_case = 0;}
else if (j < 6 && j >= 3) {j_case = 3;}
else {j_case = 6;}
if (grille[i][j] != 0) // On vérifie si il y a déjà un chiffre dans la case, auquel cas les étapes suivantes ne sont pas nécéssaires, aucun coup n'est possible dans cette case.
{
return 0;
}
else
{
/* On vérifie si il y a déjà une case contenant n dans ce carré */
for (k = i_case; k < i_case + 3; k++) // Il y a deux cases en plus de celle de départ dans le carré (en ligne et en colonne)
{
for (l = j_case; l < j_case + 3; l++ )
{
if (grille[k][l] == n)
{
return 0; // Si il y a une case du carré qui contient n, pas besoin d'aller plus loin : on arrête et retourne 0
}
}
}
// Si aucune case du carré ne contient n, on test la ligne et la colonne
for (k = 0; k < 9; k++)
{
if (grille[k][j] == n) // On teste la colonne
{
return 0; // Si il y a déjà un n dans la colonne, on arrête et retourne 0
}
else if (grille[i][k] == n) // On teste la ligne
{
return 0; // Si il y a déjà un n dans la ligne, on arrête et retourne 0
}
}
return 1; // Si on arrive jusqu'ici c'est qu'il n'y a pas de n dans le carré, la colonne et la ligne, donc la case peut contenir n
}
}
/* On vérifie toutes les cases de la grille en utilisant la fonction verif_case */
void verif_possibilites (int grille[9][9], nb grille_poss[9][9])
{
int i, j, n;
for (i = 0; i < 9; i++)
{
for (j = 0; j < 9;j++)
{
for (n = 0; n < 9; n++)
{
grille_poss[i][j].nombre[n] = verif_case(grille, (n+1), i, j); // n+1 car ici n de 0 à 8 (décalage dû au tableau, alors qu'on veut tester le vrai n)
}
}
}
}
void verif_fini(int grille[9][9], int *fini)
{
int i, j;
*fini = 1; // On affecte la valeur 1 à fini puis on vérifie si il reste des cases blanches, auquel cas fini prend la valeur 0 (= faux, soit non fini)
for (i= 0; i < 9; i++)
{
for (j = 0; j < 9; j++)
{
if(grille[i][j] == 0)
{
*fini = 0;
}
}
}
}
int verif_impossible(int grille[9][9]) // Vérifie si la résolution de la grille est possible (pas de cases où il n'y a pas de possibilités)
{
int i, j, n, impossible = 0, coup_possible;
// nb grille_poss[9][9] = {0};
nb grille_poss[9][9] ;
verif_possibilites(grille, grille_poss);
for(i = 0; i < 9; i++)
{
for(j = 0; j < 9; j++)
{
if(grille[i][j] == 0)
{
coup_possible = 0;
for(n = 0; n < 9; n++)
{
if(grille_poss[i][j].nombre[n] != 0) {coup_possible = 1;} // On regarde si au moins un coup est possible
}
if(coup_possible == 0) {impossible = 1;} // Si aucun coup n'est possible la grille est impossible
}
}
}
return impossible;
}
int verif_valide(int grille[9][9])
{
int i, j, n, valide, p;
valide = 1;
for(i = 0; i < 9; i++)
{
for(j = 0; j < 9; j++)
{
n = grille[i][j]; // On sauvegarde le chiffre présent dans la case
grille[i][j] = 0; // On vide cette case pour savoir si n peut aller dedans
p = verif_case(grille, n, i, j); // On vérifie si le coup est possible
grille[i][j] = n; // On replace n
if(!p && n != 0) {valide = 0;} // Si le coup n'est pas possible la grille n'est pas valide
}
}
return valide;
}