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 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211
| #!/usr/bin/env python
#-*- coding:utf-8 -*-
"""
Programme Sudoku
fait le 11/10/2014
Python 2.7.6
"""
import numpy as np
#import time
# ============================================================================
# Classes
# ============================================================================
class Sudoku():
"""
Permet de définir et résoudre un sudoku
"""
def __init__(self, data):
"""
initialise le sudoku
"""
self.tableau = data # tableau initiale - celui à résoudre
self.solution = np.zeros((9, 9)) # initialisation - tableau solution
self.iteration = 0 # nb d'itérations avant résultat final
# self.solve()
def __repr__(self):
"""
permet d'affichier le tableau initiale et la solution
"""
print "\nTableau initiale\n"
affiche_tab(self.tableau)
print "\nSolution\n"
affiche_tab(self.solution)
print "\nNb d'itérations :", self.iteration
return ""
def ligne(self, i):
"""
liste des nb dans une ligne
"""
return self.solution[i, :]
def colonne(self, j):
"""
liste des nb dans une colonne
"""
return self.solution[:, j]
def pos_carre(self, i, j):
"""
retourne la position d'un sous tableau sudoku
"""
return 3*(i//3), 3*(j//3)
def carre(self, i, j):
"""
retourne l'ensemble de nb d'un sous tableau
"""
pos_i, pos_j = self.pos_carre(i, j)
sous_tableau = self.solution[pos_i:pos_i+3, pos_j:pos_j+3]
return sous_tableau
def presence_valeur(self, i, j, val):
"""
test booleen pour savoir si un chiffre est déjà dans le tableau
"""
return (val in self.ligne(i)) \
or (val in self.colonne(j)) \
or (val in self.carre(i, j))
def case_vide(self, i, j):
"""
test pour savoir si la case est rempli ou non
"""
return self.tableau[i, j] == 0
def avance(self, i, j, val):
"""
détermine les indices de la case suivante pour la recherche
"""
# on avance
j = j+1
val = 1
if j > 9:
i = i+1
j = 1
return i, j, val
def recule(self, i, j, val):
"""
détermine les indices de la case précédente pour la recherche
"""
# on recule
j = j-1
if j < 0:
j = 8
i = i-1
# on efface la valeur precedente
# puis on teste la valeur suivante
val = self.solution[i, j]+1
if self.case_vide(i, j):
self.solution[i, j] = 0
else:
i, j, val = self.recule(i, j, val)
return i, j, val
def deplacement(self, i, j, val):
"""
gère le suivi de la case de recherche
"""
if val < 10:
# print "en avant"
return self.avance(i, j, val)
else:
# print "en arrière"
return self.recule(i, j, val)
def solve(self):
"""
resolution récursive du sudoku
ne gère pas les sudoku sans solution
"""
self.solution = np.copy(self.tableau)
# on parcours tout le self.tableau
i = 0
while i < 9:
j = 0
val = 1
while j < 9:
# on teste toutes les valeurs
if self.case_vide(i, j) and val < 10:
if self.presence_valeur(i, j, val):
val = val+1
else:
self.solution[i, j] = val
self.iteration = self.iteration + 1
# affiche_tab(self.solution)
# time.sleep(0.1)
i, j, val = self.deplacement(i, j, val)
else:
i, j, val = self.deplacement(i, j, val)
i = i + 1
# ============================================================================
# Fonctions
# ============================================================================
def affiche_tab(tableau):
"""
affiche le sudoku en console
"""
i, j = 0, 0
for i in range(9):
if i%3 == 0:
print "-------------------------"
for j in range(9):
if j%3 == 0:
print "|",
if tableau[i, j] == 0:
print "_",
else:
print tableau[i, j],
print "|"
print "-------------------------"
# ============================================================================
# Programme
# ============================================================================
if __name__ == '__main__':
# tab_inconnu = [[0,0,0,0,0,0,0,0,0],
# [0,0,0,0,0,0,0,0,0],
# [0,0,0,0,0,0,0,0,0],
# [0,0,0,0,0,0,0,0,0],
# [0,0,0,0,0,0,0,0,0],
# [0,0,0,0,0,0,0,0,0],
# [0,0,0,0,0,0,0,0,0],
# [0,0,0,0,0,0,0,0,0],
# [0,0,0,0,0,0,0,0,0]]
# tab_inconnu = [[3,0,0,0,7,6,8,0,0],
# [0,6,5,0,4,3,0,7,0],
# [9,0,0,8,0,0,0,0,3],
# [0,0,2,6,0,0,0,8,0],
# [0,3,9,0,8,0,2,6,0],
# [0,8,0,0,0,7,5,0,0],
# [5,0,0,0,0,2,0,0,7],
# [0,4,0,7,1,0,9,5,0],
# [0,0,6,5,9,0,0,0,8]]
tab_inconnu = [[0,2,0,1,0,0,0,0,0],
[0,0,5,0,2,0,4,0,0],
[1,3,0,0,4,8,0,0,0],
[0,6,0,0,8,0,0,0,1],
[0,1,0,2,0,4,0,9,0],
[4,0,0,0,7,0,0,2,0],
[0,0,0,8,9,0,0,5,2],
[0,0,9,0,1,0,6,0,0],
[0,0,0,0,0,6,0,7,0]]
tab_inconnu = np.array(tab_inconnu)
mSudok = Sudoku(tab_inconnu)
# start_time = time.time()
mSudok.solve()
# elapsed_time = time.time() - start_time
print mSudok
# print elapsed_time |
Partager