我正在尝试编写一些代码来解决python中一个简单的9X9数独板的问题。卡在最后一个函数上:solve(board)。
我的代码:
def check1D(A):
miss = []
for j in list(range(1,len(A)+1)):
if j in A:
continue
else:
miss.append(j)
return(miss)
def check2D(B):
return(check1D(B.flatten()))
def checkRow(board,x,y):
return(check1D(board[x,:]))
def checkCol(board,x,y):
return(check1D(board[:,y]))
def checkBox(board,x,y):
ymin = (y//3)*3
xmin = (x//3)*3
return(check2D(board[xmin:xmin+3,ymin:ymin+3]))
以上功能检查一维列表。 2D展平阵列以应用1D检查。行,上校使用一维检查来找到Candadites。 Box会计算出正确的3X3使用2D功能检查缺失数字所需的最小/最大。
def cand(board,x,y):
list = []
box = checkBox(board,x,y)
row = checkRow(board,x,y)
col = checkCol(board,x,y)
for i in box:
if i in row and i in col:
list.append(i)
if len(list) > 1:
list = [0]
elif not list:
list.append(0)
return(list)
def solve(board):
while board.min() == 0:
row = len(board[0,:])
col = len(board[:,0])
for i in range(row):
for j in range(col):
if board[i][j] == 0:
unique = cand(board,i,j)
board[i][j] = unique[0]
return(board)
我已经检查了所有功能,它们似乎正常工作。 cand(board,x,y)在列表中生成唯一的Candadite或零。
控制台卡在用于2D数组的B.flatten()方法上。
这是试图解决的简易数独9X9:
easy = np.array([
[0,0,0, 3,7,0, 0,5,6],
[5,0,0, 0,1,0, 9,7,0],
[0,6,0, 9,8,0, 3,4,0],
[0,0,7, 0,0,2, 0,8,0],
[0,0,9, 0,3,0, 6,0,0],
[0,5,0, 0,3,0, 6,0,0],
[0,7,5, 0,6,9, 0,2,0],
[0,4,8, 0,2,0, 0,0,5],
[2,9,0, 0,5,8, 0,0,0]
])
感谢您的帮助。想了解我上一个函数中的循环出了什么问题。谢谢。
您的示例无法单独使用该方法解决。它陷入了无尽的循环中,在循环中找不到更多的唯一值。
卡住之前的最后一块板是:
[[0, 0, 1, 3, 7, 4, 2, 5, 6], [5, 3, 4, 2, 1, 6, 9, 7, 8], [7, 6, 0, 9, 8, 5, 3, 4, 1], [6, 1, 7, 5, 9, 2, 4, 8, 3], [0, 8, 9, 0, 3, 7, 6, 1, 2], [4, 5, 2, 8, 3, 1, 6, 9, 7], [3, 7, 5, 1, 6, 9, 8, 2, 4], [1, 4, 8, 7, 2, 3, 0, 6, 5], [2, 9, 6, 4, 5, 8, 0, 3, 0]]
easy
中定义的数据对于Sudoku规则无效(即,同一框/行/列中有多个相同的值,例如,中心框中的3)。
此答案的其余部分使用以下内容对此进行补偿:
easy = np.array([
[0,0,0, 3,7,0, 0,5,6],
[5,0,0, 0,1,0, 9,7,0],
[0,6,0, 9,8,0, 3,4,0],
[0,0,7, 0,0,2, 0,8,0],
[0,0,9, 0,3,0, 6,0,0],
[0,5,0, 0,9,0, 7,0,0],
[0,7,5, 0,6,9, 0,2,0],
[0,4,8, 0,2,0, 0,0,5],
[2,9,0, 0,5,8, 0,0,0]
])
连同cand
中的唯一数字检查,您可以添加一些检查以查看在该行/列/框中是否只能输入一个值:
def cand(board,x,y):
list = []
box = checkBox(board,x,y)
row = checkRow(board,x,y)
col = checkCol(board,x,y)
if len(box) == 1:
return box
if len(row) == 1:
return row
if len(col) == 1:
return col
for i in box:
if i in row and i in col:
list.append(i)
if len(list) > 1:
list = [0]
elif not list:
list.append(0)
return(list)
这解决了董事会:
[[9, 8, 1, 3, 7, 4, 2, 5, 6], [5, 3, 4, 2, 1, 6, 9, 7, 8], [7, 6, 2, 9, 8, 5, 3, 4, 1], [3, 1, 7, 6, 4, 2, 5, 8, 9], [8, 2, 9, 5, 3, 7, 6, 1, 4], [4, 5, 6, 8, 9, 1, 7, 3, 2], [1, 7, 5, 4, 6, 9, 8, 2, 3], [6, 4, 8, 7, 2, 3, 1, 9, 5], [2, 9, 3, 1, 5, 8, 4, 6, 7]]
您可能还应该检查solve
中的循环是否完成而未更改任何值以处理陷入无限循环的程序。