-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest.py
111 lines (100 loc) · 4.55 KB
/
test.py
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
import copy
def contrainte_ligne(grille, contrainte_row):
"""vérifie les contrainte des ligne
Args:
grille (list[list[bool]]): grille du jeu
contrainte_row (list): liste des contraintes des lignes
Returns:
bool_: Vrai si la grille est gagnante
"""
for i, contrainte in enumerate(contrainte_row):
ligne_data = [grille[i][j] for j in range(dim)]
groups = []
compteur = 0
for case in ligne_data:
if case > 0:
compteur += 1
elif compteur > 0:
groups.append(compteur)
compteur = 0
if compteur > 0:
groups.append(compteur)
if groups != contrainte:
return False
return True
def contrainte_colonne(grille, contrainte_col, satisfaisable=False):
"""vérifie les contrainte des colonne
Args:
grille (list[list[bool]]): grille du jeu
contrainte_col (list): liste des contraintes des colonnes
Returns:
bool_: Vrai si la grille est gagnante
"""
for j, contrainte in enumerate(contrainte_col):
col_data = [grille[i][j] for i in range(len(grille))]
groups = []
compteur = 0
for case in col_data:
if case > 0:
compteur += 1
elif compteur > 0:
groups.append(compteur)
compteur = 0
if compteur > 0:
groups.append(compteur)
if groups != contrainte:
if not satisfaisable:
return False
elif len(groups) > len(contrainte):
return False
for i in range(len(groups)):
if len(groups) == len(contrainte):
if groups[i] != contrainte[i] and i < len(contrainte) - 1 :
return False
else:
if groups[i] > contrainte[i]:
return False
return True
def peut_placer_block(grille, i, j, k):
"""Vérifie si il est possible de placer un bloc de k cases horizontalement sur la grille"""
for c in range(j, j + k):
if grille[i][c] > 0:
return False
return True
def solver_brut(grille: list[list[bool]], contrainte_row: list, contrainte_col: list, i=0, j=0, p=0):
"""Résous la grille en fonction des contraintes
Args:
grille (list[list[bool]]): grille du jeu
contrainte_row (list): contraintes des lignes
contrainte_col (list): contraintes des colonnes
i (int, optional): indice de la ligne. Defaults to 0.
j (int, optional): indice de la colonne. Defaults to 0.
p (int, optional): indice de la contrainte. Defaults to 0.
Returns:
list[list[bool]] ou Nonetype: la grille résolue ou None si échec
"""
if contrainte_ligne(grille, contrainte_row) or i == len(contrainte_row) or not contrainte_ligne([grille[k] for k in range(i)], contrainte_row[:i]): #si toutes les contraintes des lignes sont satisfaites ou si on a atteint la fin de la grille ou si une des lignes avant la ligne actuelle n'est pas satisfaites
if contrainte_colonne(grille, contrainte_col):
return grille
return None
else:
if p >= len(contrainte_row[i]):
return solver_brut(grille, contrainte_row, contrainte_col, i + 1, 0, 0)
k = contrainte_row[i][p]
if j + k <= dim and peut_placer_block(grille, i, j, k):
temp = copy.deepcopy(grille)
for c in range(j, j + k):
temp[i][c] = 1
click(temp)
if contrainte_colonne(temp, contrainte_col, True): #contrainte des colonnes encore satisfaisable apres ajout du block
p += 1 #indice de la contrainte suivante
result = solver_brut(temp, contrainte_row, contrainte_col, i + 1, 0) if j + k > dim or (p == len(contrainte_row[i])) else solver_brut(temp, contrainte_row, contrainte_col, i, j + k + 1, p)
if result:
return result
p -= 1 #echec donc on revient a l'indice précédent
return solver_brut(grille, contrainte_row, contrainte_col, i + 1, 0) if j + k > dim else solver_brut(grille, contrainte_row, contrainte_col, i, j + 1, p) #point 2
else:
return solver_brut(grille, contrainte_row, contrainte_col, i + 1, 0) if j + k > dim else solver_brut(grille, contrainte_row, contrainte_col, i, j + 1, p) #point 2
initial_grille = [[0 for _ in range(dim)] for _ in range(dim)]
solutions = solver_brut(initial_grille, line_data[1], line_data[0])
click(solutions)