python-backtrack
Habe ich vor kurzem gepostet ein paar Fragen um zu verstehen Rekursion und backtrack, die ich fühlte, bekam ich sofort etwas, und versuchte, einen test schreiben, habe ich das sudoku zu lösen problem, aber wenn ich Schreibe den code in ein anderes format, wird der code stucks für eine Weile aus und gibt False zurück, der angibt, gibt es keine Lösung für dieses problem.
grid ist ein 9x9 Liste von Listen, wenn Liste[i][j] null ist, dann bedeutet es, es muss ausgefüllt werden.
Hier ist der code, der das problem gelöst:
def correct_solve(grid):
# if there is no more zeros
if found_solution(grid):
return True
for row in xrange(9):
for col in xrange(9):
if grid[row][col] == 0:
for num in xrange(1, 10):
grid[row][col] = num
if check_sudoku(grid) == True:
if correct_solve(grid) == True:
return True
# there are no numbers which could make
# a valid solution, so backtrack
grid[row][col] = 0
return False
Und hier ist eine weitere Funktion, die ich zu lösen versucht, das problem in einer anderen Weise, aber er scheiterte, und ich konnte nicht herausfinden, wo das problem ist
def buggy_solve(grid, col):
# if there is no more zeros
if found_solution(grid):
return True
# if the col is over 8, make it to 0
if col > 8:
col = 0
for row in xrange(9):
if grid[row][col] == 0:
for num in xrange(1, 10):
grid[row][col] = num
if check_sudoku(grid) == True:
# I tend to move to the next cell, and it seems that
# this is correct.
if buggy_solve(grid, col + 1) == True:
return True
# if there are no valid solutions, backtrack.
grid[row][col] = 0
return False
Ich habe versucht, um das Programm zu Debuggen, und hat nicht gefunden, was nützlich ist, btw ist es eine gute Praxis, um debug ein Stück Rekursion code?
EDIT:
Hier ist die matrix, die ich verwende, um zu testen:
easy = [[2,9,0,0,0,0,0,7,0],
[3,0,6,0,0,8,4,0,0],
[8,0,0,0,4,0,0,0,2],
[0,2,0,0,3,1,0,0,7],
[0,0,0,0,8,0,0,0,0],
[1,0,0,9,5,0,0,6,0],
[7,0,0,0,9,0,0,0,1],
[0,0,1,2,0,0,3,0,6],
[0,3,0,0,0,0,0,5,9]]
Du musst angemeldet sein, um einen Kommentar abzugeben.
correct_solve
sieht über all die Gitter, währendbuggy_solve
blickt auf eine einzelne Spalte. Dies bedeutet, dass, wenn das problem nicht gelöst, dochbuggy_solve
nur schauen Sie in die aktuelle Spalte für eine Zelle zu füllen-wenn diese Spalte nicht geschehen, um eine leere Zelle, es fallen wird aus der äußeren for-Schleife und beenden, ohne eine explizitereturn
- Anweisung. So müssten Sie code zum aufrufen vonbuggy_solve
auf die nächste Spalte, wenn dies geschieht (und verwenden Sie die entsprechendereturn
- Anweisung).buggy_solve(grid, col + 1)
zu bewegen, um die nächste Spaltebuggy_solve
? Ich habe versucht, hinzufügen von einem anderenelif
scheint aber, dass es nicht funktioniertDas problem ist, dass deine rekursive Lösung startet nie neu ansetzen. Stattdessen wird es am Ende in einer endlosen Rekursion, es sei denn, es wird versehentlich eine Lösung finden – das ist sehr unwahrscheinlich und funktioniert nur für weitgehend gelöst sudokus. Unter diesen Situationen heraus, das ist, was passiert:
Diese
buggy_solve
Anruf nie false zurück. Da die Funktion versucht und der Iteration über die Spalten, falls erforderlich. Und wenn es erreicht die Letzte Spalte, es wird start in der ersten wieder überschreiben alles, was vorher passiert ist.Als solche, die Rückverfolgung wird nie starten.
check_sudoku
wird selten scheitern gegeben, dass wir noch früh in der Verarbeitung und die meist ungefüllten sudoku wird wahrscheinlich erlauben, mehrere Werte in einer bestimmten Zelle.Was Sie wollen zu tun ist, um zu verhindern, dass
buggy_solve
aus Ausgangspunkt aller, d.h. entfernen Sie die Spalte zurückgesetzt werden und machen es einfach false zurück für ungültige Spalten. Sobuggy_solve
false zurück irgendwann und das backtracking können tatsächlich beginnen.buggy_solve
und es hat backtrack, ich habe versucht, Eingangs ein Gitter, das ist alles Nullen. und es scheint, dass das Programm backtracking correctlly