Vrac - Résolution de sudoku en python
Vous êtes fan de sudoku, mais la vous n'y arrivez plus, cette grille vous bloque. Pour résoudre un sudoku il y a trois procédés : recherche, candidature et analyse(1).
J'ai mis au point un algorithme simple permettant de réaliser la recherche et la candidature en un seul coup (en plusieurs étapes), mais il me manque encore la partie analyse pour pouvoir résoudre tout les sudokus car actuellement seul les plus simple sont résolut entièrement.
Voici un algorithme fonctionnel de "méthode brute", c'est à dire qu'il test toutes les solutions en partant du début et en validant au fur et à mesure les étapes, revenant au point de départ si nécessaire.
# -*- coding: utf-8 -*-
"""commencé le 18/09/08"""
"""fonctionnel le 23/09/08"""
"""les variables globales:
x et y sont les coordonnées de la case courante
n est la valeur de la case courante"""

sudoku=[[0,0,4,1,0,8,0,0,0],
        [0,0,0,3,0,0,0,9,0],
        [0,0,0,0,2,0,0,4,5],
        [0,0,0,0,0,1,0,0,2],
        [0,2,7,0,0,0,0,0,0],
        [0,3,0,0,0,0,0,6,0],
        [1,0,0,0,5,0,8,0,0],
        [0,6,3,0,0,0,9,0,0],
        [0,0,9,2,0,0,0,0,3]]

"""construction de la liste des cases vides
list_case est une liste de [x,y]"""
list_case=[]

for i in range(9):
    for j in range(9):
        if not(sudoku[i][j]):
            list_case.append([i,j])

def validite_d_une_case():
    global n,x,y,sudoku
    
    """on test la validité de la case active dans les trois zones"""
    ligne = True
    colonne = True
    carre = True
    
    for i in range(9):
        """dans la ligne"""
        if i!=y and n==sudoku[x][i]:
            ligne = False
            break
    if not(ligne):
        return False  
    
    for i in range(9):
        """dans la colonne"""
        if i!=x and n==sudoku[i][y]:
            colonne = False
            break
    if not(colonne):
        return False
        
    """dans le carre"""
#    print "x=",x,"y=",y,
    c_x = x/3
    c_y = y/3
    l_x = x%3
    l_y = y%3
    for i in range(3):
#        print "i=", i,
        for j in range(3):
#            print "j=", j
            if i%3!=l_x and j%3!=l_y:
#                print "i%3=",i%3,"l_x=",l_x,"j%3=",j%3,"l_y=",l_y
#                print "sudoku[c_x + i][c_y + j]=",sudoku[c_x + i][c_y + j]
                if sudoku[c_x * 3 + i][c_y * 3 + j] == n:
                    carre = False
    if not(carre):
        return False
    
    return True

"""algorythme de résolution"""
len_list_case = len(list_case)
id_case_in_list_case = 0

while id_case_in_list_case < len_list_case:
    
    x = list_case[id_case_in_list_case][0]
    y = list_case[id_case_in_list_case][1]
    
    if sudoku[x][y] == 9:
        if id_case_in_list_case > 0:
            sudoku[x][y] = 0
            id_case_in_list_case -=1
            
    x = list_case[id_case_in_list_case][0]
    y = list_case[id_case_in_list_case][1]

    for n in range(sudoku[x][y]+1,10):
        sudoku[x][y]=n
                
        if validite_d_une_case():
            id_case_in_list_case += 1
            break
        elif n == 9:
            sudoku[x][y]=0
            id_case_in_list_case -=1
            break
        
for i in sudoku:
    print i
source : http://fr.wikipedia.org/wiki/Sudoku

Date de création : 15/09/2008 @ 12:36
Dernière modification : 23/09/2008 @ 12:47
Catégorie : Vrac


Prévisualiser Prévisualiser     Imprimer l'article Imprimer l'article


Retrouvez toute mes news sur mon nouveau blog : Lascapi.fr


Articles

Fermer 2d

Fermer 3d

Fermer Concours

Divers

Fermer Guppy

Fermer Vrac

Recherche




^ Haut ^