/ / Python: agregar 1 impresión ¿Mata mi código? - Python, sudoku

Python: agregar 1 impresión ¿Olvida mi código? - python, sudoku

Estaba jugando con este solucionador de sudoku, que encontré.

Como se cita aquí, funciona a la perfección, pero si descomento ese sencillo print a, que comenté (línea 13), ¿entonces se detiene antes de encontrar una solución completa ...?

import sys
from datetime import datetime # for datetime.now()

def same_row(i,j): return (i/9 == j/9)
def same_col(i,j): return (i-j) % 9 == 0
def same_block(i,j): return (i/27 == j/27 and i%9/3 == j%9/3)

def r(a):
i = a.find(".")
if i == -1: # All solved !
print a
else:
#print a
excluded_numbers = set()
for j in range(81):
if same_row(i,j) or same_col(i,j) or same_block(i,j):
excluded_numbers.add(a[j])
for m in "123456789":
if m not in excluded_numbers:
# At this point, m is not excluded by any row, column, or block, so let"s place it and recurse
r(a[:i]+m+a[i+1:])

if __name__ == "__main__":
if len(sys.argv) == 2:
filI = open(sys.argv[1])
for pusI in filI:
pusI.strip()
print "pussle:n",pusI
timStart = datetime.now()
r(pusI) # <- Calling the recursive solver ...
timEnd = datetime.now()
print "Duration (h:mm:ss.dddddd): "+str(timEnd-timStart)
else:
print str(len(sys.argv))
print "Usage: python sudoku.py puzzle"

El programa necesita ser llamado con un archivo. Ese archivo debe contener 1 sudoku por línea.

Para las pruebas utilicé esto:

25...1........8.6...3...4.1..48.6.9...9.4.8...1..29.4.9.53.7....6..5...7.........

PREGUNTA:

No puedo entender cómo esa única "impresión" logra romper el ciclo recursivo, antes de que se haga. ¿Alguien puede dar una explicación?

Atentamente Martin@Hvidberg.net

Crédito: originalmente encontré el código de solución de problemas de sudoku anterior aquí: http://www.scottkirkwood.com/2006/07/shortest-sudoku-solver-in-python.html También se muestra aquí en StackOverflow: Más corto Sudoku Solver en Python - ¿Cómo funciona?

Respuestas

5 para la respuesta № 1

Realmente encuentra la solución. Ejecuté el programa y obtengo la solución.

256491738471238569893765421534876192629143875718529643945387216162954387387612954

Si ejecuta el comentario que sugirió y lo envió a un archivo:

python solver.py file.txt > output.txt

Y busca la cadena de solución, está ahí. No es la última línea, para mí aparece un 67% en el archivo.

La razón por la que hace esto es que el solucionadorBásicamente, pasa por un montón de combinaciones y encuentra la solución, pero continúa siempre que haya algún camino posible para encontrar una solución posible.