Python 递归数独求解器不返回解决方案 [英] Python Recursive Sudoku Solver Doesn't Return the Solution
本文介绍了Python 递归数独求解器不返回解决方案的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我尝试优化这个代码,我的最终代码如下所示
I tried to optimize this code and my final code was as shown below
import numpy as np
sudoku = np.array([[0, 9, 0, 0, 5, 0, 6, 0, 8],
[0, 0, 0, 7, 1, 0, 3, 5, 0],
[2, 1, 0, 0, 0, 0, 7, 0, 4],
[0, 0, 1, 5, 0, 0, 0, 0, 6],
[6, 3, 0, 2, 0, 8, 0, 4, 5],
[7, 0, 0, 0, 0, 4, 9, 0, 0],
[9, 0, 3, 0, 0, 0, 0, 2, 1],
[0, 4, 8, 0, 2, 7, 0, 0, 0],
[5, 0, 6, 0, 8, 0, 0, 3, 0]])
#Checking if the number (n) can be placed there (row, col)
def check(sudoku, row, col, n):
# Row check
if np.sum(sudoku[row,:] == n) != 0: return False;
# Col check
if np.sum(sudoku[:,col] == n) != 0: return False;
# Sqr check
row0, col0 = (row//3)*3, (col//3)*3
if np.sum(sudoku[row0:row0+3,col0:col0+3] == n) != 0: return False;
return True
def solve_sudoku(sudoku):
rows, cols = np.where(sudoku == 0)
for row in rows:
for col in cols:
for num in range(1, 10):
if check(sudoku, row, col, num):
sudoku[row, col] = num
solve_sudoku(sudoku)
sudoku[row, col] = 0
return
print(sudoku)
return sudoku
solved = solve_sudoku(sudoku)
我的问题是,即使解决方案成功打印如下所示,变量 solved 只是一个 NoneType 并且不存储任何内容.
My problem is that even though the solution is successfully printed as shown below, the variable solved is just a NoneType and stores nothing.
[[3 9 7 4 5 2 6 1 8]
[8 6 4 7 1 9 3 5 2]
[2 1 5 8 3 6 7 9 4]
[4 8 1 5 9 3 2 7 6]
[6 3 9 2 7 8 1 4 5]
[7 5 2 1 6 4 9 8 3]
[9 7 3 6 4 5 8 2 1]
[1 4 8 3 2 7 5 6 9]
[5 2 6 9 8 1 4 3 7]]
TL;DR 该函数打印解决方案但不返回任何内容.我应该怎么做才能保存打印的溶液?
TL;DR The function prints the solution but returns nothing. What should I do to store the printed solution?
推荐答案
几个小时后,我想出了这个解决方案.已解决现在存储解决方案.
After a few hours, I came up with this solution. solved stores the solution now.
import numpy as np
sudoku = np.array([[0, 9, 0, 0, 5, 0, 6, 0, 8],
[0, 0, 0, 7, 1, 0, 3, 5, 0],
[2, 1, 0, 0, 0, 0, 7, 0, 4],
[0, 0, 1, 5, 0, 0, 0, 0, 6],
[6, 3, 0, 2, 0, 8, 0, 4, 5],
[7, 0, 0, 0, 0, 4, 9, 0, 0],
[9, 0, 3, 0, 0, 0, 0, 2, 1],
[0, 4, 8, 0, 2, 7, 0, 0, 0],
[5, 0, 6, 0, 8, 0, 0, 3, 0]])
solved = np.zeros_like(sudoku)
def check(arg, row, col, n):
if np.sum(arg[row,:] == n) != 0: return False;
if np.sum(arg[:,col] == n) != 0: return False;
row0, col0 = (row//3)*3, (col//3)*3
if np.sum(arg[row0:row0+3,col0:col0+3] == n) != 0: return False;
return True
def solve_sudoku(arg):
global solved
rows, cols = np.where(arg == 0)
for row in rows:
for col in cols:
for num in range(1, 10):
if check(arg, row, col, num):
arg[row, col] = num
solve_sudoku(arg)
arg[row, col] = 0
return
solved = arg.copy()
solve_sudoku(sudoku)
不知道这是否是优化代码的最佳方式,欢迎反馈.
I don't know if it it is the best way to optimize the code, feedbacks are welcomed.
这篇关于Python 递归数独求解器不返回解决方案的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文