/
grille.c
153 lines (128 loc) · 3.75 KB
/
grille.c
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
145
146
147
148
149
150
151
152
153
/**
* @author Samuel Bazniar
* @author Robin Dupret
*/
#include "grille.h"
/**
* Charge une grille de Sudoku pour un fichier et une ligne donnés.
*
* @param nom_fichier - Chemin vers le fichier.
* @param grille - Pointeur sur la grille.
* @param ligne - Ligne où la grille est écrite.
* @return void
*/
void charger(char *nom_fichier, Grille *grille, int ligne) {
FILE *fichier = fopen(nom_fichier, "r");
int d, i, j, k, debut, debut_ligne, n = 0;
int compteur = 0;
// On rajoute le numéro de la ligne car \n compte
// pour un caractère.
fseek(fichier, (ligne*81)+ligne, SEEK_CUR);
while (fscanf(fichier, "%1d", &d) == 1 && n < 81) {
grille->tableau[n].valeur = d;
grille->tableau[n].deBase = d != 0;
n++;
}
// +-------------------------------------+
// | Représentation en tableau de lignes |
// +-------------------------------------+
for (i = 0; i < 9; i++) {
for (j = 0; j < 9; j++) {
grille->lignes[i][j] = grille->tableau[compteur];
compteur++;
}
}
// +--------------------------------------+
// | Représentation en tableau de régions |
// +--------------------------------------+
for (i = 0; i < 9; i++) {
debut = i < 3 ? 0 : (i < 6 ? 3 : 6);
compteur = 0;
for (j = debut; j < debut+3; j++) {
debut_ligne = i % 3 == 0 ? 0 : (i % 3 == 1 ? 3 : 6);
for (k = debut_ligne; k < debut_ligne+3; k++)
grille->regions[i][compteur++]= grille->lignes[j][k];
}
}
fclose(fichier);
}
/**
* Vérifie si une valeur est présente dans un tableau.
*
* @param tab - Tableau.
* @param i - Valeur à chercher.
* @return bool
*/
bool estDans(Case *tab, int i) {
int j;
for (j = 0; j < 9; j++)
if (tab[j].valeur == i)
return true;
return false;
}
/**
* Vérifie si une valeur est absente d'une ligne.
*
* @param grille - Pointeur sur la grille.
* @param valeur - Valeur à chercher.
* @param ligne - Ligne sur laquelle chercher.
* @return bool
*/
bool absentLigne(Grille *grille, int valeur, int ligne) {
int colonne;
for (colonne = 0; colonne < 9; colonne++)
if (grille->lignes[ligne][colonne].valeur == valeur)
return false;
return true;
}
/**
* Vérifie si une valeur est absente d'une colonne.
*
* @param grille - Pointeur sur la grille.
* @param valeur - Valeur à chercher.
* @param colonne - Colonne sur laquelle chercher.
* @return bool
*/
bool absentColonne(Grille *grille, int valeur, int colonne) {
int ligne;
for (ligne = 0; ligne < 9; ligne++)
if (grille->lignes[ligne][colonne].valeur == valeur)
return false;
return true;
}
/**
* Vérifie si une valeur est absente d'une région. La région
* est déterminée à partir de la ligne et de la colone à
* laquelle le processus de résolution se trouve.
*
* @param grille - Pointeur sur la grille.
* @param valeur - Valeur à chercher.
* @param ligne - Ligne actuelle.
* @param colonne - Colonne actuelle.
* @return bool
*/
bool absentRegion(Grille *grille, int valeur, int ligne, int colonne) {
int i, j;
// Précedent code utilisant la représentation en tableaux
// de régions (trop lente, c.f. compte rendu).
//
// int i, region;
//
// if (colonne < 3)
// region = ligne < 3 ? 0 : (ligne < 6 ? 3 : 6);
// else if (colonne < 6)
// region = ligne < 3 ? 1 : (ligne < 6 ? 4 : 7);
// else
// region = ligne < 3 ? 2 : (ligne < 6 ? 5 : 8);
//
// for (i = 0; i < 9; i++)
// if (grille->regions[region][i].valeur == valeur)
// return false;
int debut_l = ligne - (ligne % 3);
int debut_c = colonne - (colonne % 3);
for (i = debut_l; i < debut_l + 3; i++)
for (j = debut_c; j < debut_c + 3; j++)
if (grille->lignes[i][j].valeur == valeur)
return false;
return true;
}