假设我有数独数组,用于数独求解器,例如:
[[0 0 0 0 0 0 0 5 0]
[2 0 7 0 0 9 0 0 0]
[6 0 0 3 5 1 0 0 0]
[5 0 0 0 0 0 0 1 0]
[0 0 3 0 0 0 0 0 8]
[0 0 0 8 2 0 5 3 0]
[0 0 0 0 7 0 8 0 4]
[0 0 6 2 0 0 0 0 0]
[0 8 0 0 0 0 7 0 0]]
我有一个名为nextMove()
的方法,目前返回下一个要检查的坐标。
for x in range(9):
for y in range(9):
if sudoku[x][y] == 0:
return [x,y]
在阅读Norwig的算法书时,我偶然发现了一种消除策略,我想尝试将其应用于求解器中。我的基本想法是检查哪个行+列组合具有最少的可能性(周围数字最多)。
我已经尝试过:
def next_move(sudoku):
row = 0
current_number_row = 0
current_number_column = 0
column = 0
max_num_col = 0
max_num_row = 0
for x in range(9):
current_number_row = 0
for y in range(9):
if sudoku[x][y] != 0:
current_number_row += 1
if current_number_row > max_num_row and current_number_row < 9:
max_num_row = current_number_row
row = x
for m in range(9):
current_number_column = 0
if sudoku[row][m] == 0:
for g in range(9):
if sudoku[g][m] != 0:
current_number_column += 1
if current_number_column > max_num_col and current_number_column < 9:
max_num_col = current_number_column
column = m
return [row, column]
但这并不起作用,因为有时算法会返回已经填充的相同位置。
我如何编写排除策略以提高性能,同时仍能解决数独问题?