干货 | 手把手教你用115行代码做个数独解析器!
def identify_number(image): image_resize = cv2.resize(image, (28,28)) # For plt.imshow image_resizeimage_resize_2 = image_resize.reshape(1,1,28,28) # For input to model.predict_classes # cv2.imshow( number , image_test_1) loaded_modelloaded_model_pred = loaded_model.predict_classes(image_resize_2 , verbose = 0) return loaded_model_pred[0] 完成以上步骤后,数独网格看起来是这样的: 提取的数独 第三步:用回溯算法计算数独的解 我们将使用回溯算法来计算数独的解。 在网格中搜索仍未分配的条目。如果找到引用参数行,col 将被设置为未分配的位置,而 true 将被返回。如果没有未分配的条目保留,则返回false。“l” 是 solve_sudoku 函数传递的列表变量,用于跟踪行和列的递增。 def find_empty_location(arr,l): for row in range(9): for col in range(9): if(arr[row][col]==0): l[0]=row l[1]=col return True return False 返回一个boolean,指示指定行的任何赋值项是否与给定数字匹配。 def used_in_row(arr,row,num): for i in range(9): if(arr[row][i] == num): return True return False 返回一个boolean,指示指定列中的任何赋值项是否与给定数字匹配。 def used_in_col(arr,col,num): for i in range(9): if(arr[i][col] == num): return True return False 返回一个boolean,指示指定的3x3框内的任何赋值项是否与给定的数字匹配。 def used_in_box(arr,row,col,num): for i in range(3): for j in range(3): if(arr[i+row][j+col] == num): return True return False 检查将num分配给给定的(row, col)是否合法。检查“ num”是否尚未放置在当前行,当前列和当前3x3框中。 def check_location_is_safe(arr,row,col,num): return not used_in_row(arr,row,num) and not used_in_col(arr,col,num) and not used_in_box(arr,row - row%3,col - col%3,num) 采用部分填入的网格,并尝试为所有未分配的位置分配值,以满足数独解决方案的要求(跨行、列和框的非重复)。“l” 是一个列表变量,在 find_empty_location 函数中保存行和列的记录。将我们从上面的函数中得到的行和列赋值给列表值。 def solve_sudoku(arr): l=[0,0] if(not find_empty_location(arr,l)): return True row=l[0] col=l[1] for num in range(1,10): if(check_location_is_safe(arr,row,col,num)): arr[row][col]=num if(solve_sudoku(arr)): return True # failure, unmake & try again arr[row][col] = 0 return False 最后一件事是print the grid。 (编辑:应用网_阳江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |