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
2.470 visualizaciones desde el 27 de Febrero del 2014. Una media de 21 por semana
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
2.471 visualizaciones desde el 27 de Febrero del 2014. Una media de 21 por semana
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

http://lwp-l.com/s2616