数独求解器 Python
数独是一种基于逻辑的数字排列谜题游戏,在热爱逻辑和推理的人中最受欢迎。解决数独谜题有助于大脑提高注意力和逻辑思维。
本文介绍了我们如何使用Python解决数独问题。
在Python中使用回溯算法来解决数独问题
在寻找计算问题的解决方案时,回溯算法是我们经常使用的技术。在解数独时,它检查填入框中的数字是否有效。
如果是无效的,它就检查1到9的其他数字。如果它发现没有有效的数字,它就回溯到前一个选项。
当我们到达一个死胡同并返回到上一个选择时,我们已经做出并将改变我们的选择,从而产生一个不同的可能解决方案。
让我们采取与回溯算法一起实现数独解算器的方法。
首先,我们必须通过形成谜题来设置棋盘。
def setBoardFunc(puz):
global grid
print('n---------------Sudoku Solver---------------n')
print('Here is the Sudoku Problem :')
for i in range(0, len(puz), 9):
row = puz[i:i+9]
temp = []
for block in row:
temp.append(int(block))
grid.append(temp)
printGridFunc()
在这里,我定义了一个名为setBoardFunc()
的函数来形成谜题。在循环过程中,它设置了一个9×9的拼图,并将空单元格初始化为0
。
在完成函数的操作后,它打印出在puz
中给出的输入。然后我们要打印网格;这一步打印出9×9的网格,并给出输入。
def printGridFunc():
global grid
for row in grid:
print(row)
接下来,我们将检查当前值是否能放在当前的方格内。
def checkValidFunc(row,column,num):
global grid
for i in range(0,9):
if grid[row] [i] == num:
return False
for i in range(0,9):
if grid[i] [column] == num:
return False
square_row = (row//3)*3
square_col = (column//3)*3
for i in range(0,3):
for j in range(0,3):
if grid[square_row+i][square_col+j] == num:
return False
return True
这一步检查给定的数字是否对特定的盒子有效。这个数字应该是同行、同列、同块的盒子中没有一个能放在当前位置的。
如果该数字满足该要求并返回true
,我们就可以转到下一个值;如果不是,该数字会被拒绝。然后我们要遍历所有的块,适应回溯算法。
def solveFunc():
global grid
for row in range(9):
for column in range(9):
if grid[row] [column] == 0:
for num in range(1,10):
if checkValidFunc(row,column,num):
grid[row] [column] = num
solveFunc()
grid[row] [column] = 0
return
print('nSolution for the Sudoku Problem: ')
printGridFunc()
这个代码块的后半部分检查数字是否有效。在这里,它已经引入了函数回溯算法。
首先,它搜索一个空单元格;如果找到了,则说明已解的数独在那里,并打印出给定数独的解。如果它发现了任何空格,它将通过迭代猜测一个从1到9的数字。
如果存在一个有效的数字,它就会调用solveFunc()
,并移动到下一个空单元格,但是如果没有一个猜测的数字是有效的,那么之前调用的函数将把单元格的值重置为0
,并继续迭代以找到下面的有效数字。
当算法用有效数字填满空框直到死胡同时,它就会回溯这个过程并重新重复整个过程。最后,让我们传递网格并调用函数来解决给定的数独问题。
puz = "004300209005009001070060043006002087190007400050083000600000105003508690042910300"
grid = []
setBoardFunc(puz)
solveFunc()
完整的源代码:
def setBoardFunc(puz):
global grid
print('n---------------Sudoku Solver---------------n')
print('Here is the Sudoku Problem :')
for i in range(0, len(puz), 9):
row = puz[i:i+9]
temp = []
for block in row:
temp.append(int(block))
grid.append(temp)
printGridFunc()
def printGridFunc():
global grid
for row in grid:
print(row)
def checkValidFunc(row,column,num):
global grid
for i in range(0,9):
if grid[row] [i] == num:
return False
for i in range(0,9):
if grid[i] [column] == num:
return False
square_row = (row//3)*3
square_col = (column//3)*3
for i in range(0,3):
for j in range(0,3):
if grid[square_row+i][square_col+j] == num:
return False
return True
def solveFunc():
global grid
for row in range(9):
for column in range(9):
if grid[row] [column] == 0:
for num in range(1,10):
if checkValidFunc(row,column,num):
grid[row] [column] = num
solveFunc()
grid[row] [column] = 0
return
print('nSolution for the Sudoku Problem: ')
printGridFunc()
puz = "004300209005009001070060043006002087190007400050083000600000105003508690042910300"
grid = []
setBoardFunc(puz)
solveFunc()
输出:
结论
尽管有更多的解题方法,但使用回溯算法使数独的最终输出更加准确,但由于它由许多迭代组成,所以需要更多的时间。然而,解决数独谜题可以提高一个人的逻辑思维能力,是一种令人兴奋的休闲方式。