Código de Python - Código para solucionar un sudoku

Imágen de perfil

Código para solucionar un sudokugráfica de visualizaciones


Python

Publicado el 27 de Febrero del 2014 por Administrador (686 códigos)
7.618 visualizaciones desde el 27 de Febrero del 2014
Simple código que muestra como resolver cualquier sudoku. Muestra los pasos que va haciendo hasta resolver dicho sudoku.

Versión 1

Publicado el 27 de Febrero del 2014gráfica de visualizaciones de la versión: Versión 1
7.619 visualizaciones desde el 27 de Febrero del 2014
estrellaestrellaestrellaestrellaestrella
estrellaestrellaestrellaestrella
estrellaestrellaestrella
estrellaestrella
estrella


Forma parte de David Adler
 
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
import re
import random
import os
 
# variable global que define la cantidad de valores que tiene el sudoku
grid_size = 81
 
# funcion que devuelve true si ya estan todos los valores
def isFull (grid):
    return grid.count('.') == 0
 
def getTrialCelli(grid):
    for i in range(grid_size):
        if grid[i] == '.':
            print 'trial cell', i
            return i
 
def isLegal(trialVal, trialCelli, grid):
    cols = 0
    for eachSq in range(9):
        trialSq = [ x+cols for x in range(3) ] + [ x+9+cols for x in range(3) ] + [ x+18+cols for x in range(3) ]
        cols +=3
        if cols in [9, 36]:
            cols +=18
        if trialCelli in trialSq:
            for i in trialSq:
                if grid[i] != '.':
                    if trialVal == int(grid[i]):
                        print 'SQU',
                        return False
 
    for eachRow in range(9):
        trialRow = [ x+(9*eachRow) for x in range (9) ]
        if trialCelli in trialRow:
            for i in trialRow:
                if grid[i] != '.':
                    if trialVal == int(grid[i]):
                        print 'ROW',
                        return False
 
    for eachCol in range(9):
        trialCol = [ (9*x)+eachCol for x in range (9) ]
        if trialCelli in trialCol:
            for i in trialCol:
                if grid[i] != '.':
                    if trialVal == int(grid[i]):
                        print 'COL',
                        return False
 
    print 'is legal', 'cell',trialCelli, 'set to ', trialVal
    return True
 
# funcion para establecer un valor a una celda
def setCell(trialVal, trialCelli, grid):
    grid[trialCelli] = trialVal
    return grid
 
# funcion para limpiar un posible valor de una celda
def clearCell( trialCelli, grid ):
    grid[trialCelli] = '.'
    print 'clear cell', trialCelli
    return grid
 
# funcion que muestra el grid con los valores
def printGrid (grid, add_zeros):
    i = 0
    for val in grid:
        if add_zeros == 1:
            if int(val) < 10:
                print '0'+str(val),
            else:
                print val,
        else:
                print val,
        i +=1
        if i in [ (x*9)+3 for x in range(81)] +[ (x*9)+6 for x in range(81)] +[ (x*9)+9 for x in range(81)]:
                print '|',
        if add_zeros == 1:
            if i in [ 27, 54, 81]:
                print '\n---------+----------+----------+'
            elif i in [ (x*9) for x in range(81)]:
                print '\n'
        else:
            if i in [ 27, 54, 81]:
                print '\n------+-------+-------+'
            elif i in [ (x*9) for x in range(81)]:
                print '\n'
 
def hasSolution (grid):
    if isFull(grid):
        print '\nSOLVED'
        return True
    else:
        trialCelli = getTrialCelli(grid)
        trialVal = 1
        solution_found = False
        while ( solution_found != True) and (trialVal < 10):
            print 'trial valu',trialVal,
            if isLegal(trialVal, trialCelli, grid):
                grid = setCell(trialVal, trialCelli, grid)
                if hasSolution (grid) == True:
                    solution_found = True
                    return True
                else:
                    clearCell( trialCelli, grid )
            print '++'
            trialVal += 1
    return solution_found
 
def main ():
    # cada punto, significa el lugar donde tiene que buscar el numero
    #sampleGrid = ['2', '1', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '3', '1', '.', '.', '.', '.', '9', '4', '.', '.', '.', '.', '7', '8', '2', '5', '.', '.', '4', '.', '.', '.', '.', '.', '.', '6', '.', '.', '.', '.', '.', '1', '.', '.', '.', '.', '8', '2', '.', '.', '.', '7', '.', '.', '9', '.', '.', '.', '.', '.', '.', '.', '.', '3', '1', '.', '4', '.', '.', '.', '.', '.', '.', '.', '3', '8', '.']
    #sampleGrid = ['.', '.', '3', '.', '2', '.', '6', '.', '.', '9', '.', '.', '3', '.', '5', '.', '.', '1', '.', '.', '1', '8', '.', '6', '4', '.', '.', '.', '.', '8', '1', '.', '2', '9', '.', '.', '7', '.', '.', '.', '.', '.', '.', '.', '8', '.', '.', '6', '7', '.', '8', '2', '.', '.', '.', '.', '2', '6', '.', '9', '5', '.', '.', '8', '.', '.', '2', '.', '3', '.', '.', '9', '.', '.', '5', '.', '1', '.', '3', '.', '.']
    sampleGrid = ['.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '4', '6', '2', '9', '5', '1', '8', '1', '9', '6', '3', '5', '8', '2', '7', '4', '4', '7', '3', '8', '9', '2', '6', '5', '1', '6', '8', '.', '.', '3', '1', '.', '4', '.', '.', '.', '.', '.', '.', '.', '3', '8', '.']
    printGrid(sampleGrid, 0)
    if hasSolution (sampleGrid):
        printGrid(sampleGrid, 0)
    else:
        print 'NO SOLUTION'
 
 
if __name__ == "__main__":
    main()



Comentarios sobre la versión: Versión 1 (0)


No hay comentarios
 

Comentar la versión: Versión 1

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad

http://lwp-l.com/s2616