私は宿題のために数独パズルソルバーをやっていますが、いくつかの問題に直面しています。コードは簡単なパズルのためにそれに達するが、解決策を過ぎて今サイクルするようになり、より難しいパズルの場合、明白な理由がなくても数個の9で固まってしまう。私はこれについて何か助けていただければ幸いです。 (check_cellはプレースメントが有効かどうかを判断します)ブルートフォースバックトラッキングエラーを伴うPython Sudoku再帰
- このコードではバックトラッキングが正しく実装されていますか?
- どのようにソルバーがフリーズするのを止めることができますか?それは3行を解決し、その後、ほとんどの値を9に変更してフリーズします。
いくつかのコード:
def solve_helper(self, row, col):
# Try placing a number in each column of current row
board = self.the_board
if board[row][col] != 0:
?????
elif board[row][col] == 0:
for i in range(1,10):
print("Setting value at i with ") + str (i) + (" located at ") + str(row) + str(col)
self.set_cell(row, col, i)
self.guesses = self.guesses + 1
if self.check_cell(row, col):
if self.solve_helper(row, col): return True
else:
self.set_cell(row, col, 0)
else:
return self.mover(row,col)
return False
def mover(self, row, col):
if col + 1 != 9:
return self.solve_helper(row, (col+1))
elif row + 1 != 9:
print "Moving to row" + str(row + 1)
return self.solve_helper((row+1),0)
else:
print "SOLUTION FOUND"
return True
solve_helperの一部としてelse文を使用して、ゼロ以外の値をスキップしているため、この関数はすでに機能していませんか? –
@CluelessCoder:問題は、「else」ブロックに移動してゼロ以外の値をスキップすると、解が見つかった場合でも常にFalseを返します。あなたが再帰するたびに、その呼び出しが解決策を見つける結果になる場合は、 'True'を返す準備をする必要があります。現在のボード状態をあきらめてバックトラックする必要がある場合にのみ、Falseを返すことができます。 – Blckknght
Falseがどのように渡されているのかまだ分かりません。非ゼロを正しく指示する方法がわかりません。コードはバックトラックしているようですが、正しい値で渡され、3行の空白文字がすべて9になります。 –