如何解决我有一个有效的数独求解器,但我不知道为什么!特别是递归循环,我不知道我是如何让它工作的
我将在下面发布代码,但首先要简短。 求解器采用一个数组,找到一个由 0 表示的空正方形,并检查是否有任何数字 1-9 适合。如果是,它会替换它,并移动到下一个方格。 几天来它只会填满一半的董事会,但经过一些修补后,我让它神奇地工作,但我真的不知道如何。你会看到在 next_empty_square 和 is_valid 这两个函数下面,我有执行操作的主循环,它是这样的:
for n in range(1,10): ## here is our main loop
if is_valid(y,x,n,board):
board[y][x] = n
if sudoku_solver(board):
return board
board[y][x] = 0
这个主循环让我感到困惑。我不知道为什么“if sudoku_solver(board):”突然让它回溯(在我专门用这种方式措辞之前它没有),以及为什么“board[y][x] =0”不只是重置一遍又一遍地同一个正方形。我对此很陌生,正在自己学习,因此非常感谢任何帮助。使用网格、列表和数组是一回事,但这种递归的东西确实让我很头疼。
testboard = [
[7,8,4,1,2,0],[6,7,5,9],[0,6,8],9,3,[9,5],2],[1,7]
]
def sudoku_solver(board):
def next_empty_square(board):
"""Takes a sudoku board and returns the first empty square in the form of a row(y),column(x) coordinate"""
for y in range(9):
for x in range(9):
if board[y][x] == 0:
return y,x
if next_empty_square(board) is None: #if the board is full,it will return none. In that case,return true.
return True
y,x = next_empty_square(board) #gives us the coordinates for the next empty square to use for the is_valid function
def is_valid(y,board):
"""Takes a y coordinate,an x coordinate,a number(n),and our sudoku board. It checks to see if the number fits in
the coordinates of our board by checking the row,column and 3x3 grid in which the coordinate occurs for other instances of that number."""
for i in range(9): #This loop checks the row
if board[y][i] == n:
return False
for i in range(9): #this loop checks the column
if board[i][x]== n:
return False
ygrid = (y//3)*3
xgrid = (x//3)*3
for i in range(0,3): #This loop checks the 3x3 grid
for j in range(0,3):
if board[ygrid+i][xgrid+j]==n:
return False
return True
for n in range(1,10): ## here is our main loop
if is_valid(y,board):
board[y][x] = n
if sudoku_solver(board): ## this is where I have a problem. I am not sure why this recursive function works! Why does it backtrack?
return board
board[y][x] = 0 # I am also not sure why this resets the square that it needs to. It seems like it would just reset the same square over and over
return False
def sudoku_printer(board):
"""Takes our array and prints it to look like a sudoku board"""
for i in range(len(board)):
if i%3 == 0:
print("- - - - - - - - - - - -")
for j in range(len(board[0])):
if j %3 == 0:
print( "| ",end ="")
if j == 8:
print(str(board[i][j])+ " |")
else:
print(str(board[i][j]) + " ",end ="")
print("- - - - - - - - - - - -")
sudoku_printer(sudoku_solver(testboard))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。