加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_阳江站长网 (https://www.0662zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 创业 > 模式 > 正文

干货 | 手把手教你用115行代码做个数独解析器!

发布时间:2020-09-12 15:47:38 所属栏目:模式 来源:51cto
导读:你也是数独爱好者吗? Aakash Jhawar和许多人一样,乐于挑战新的难题。上学的时候,他每天早上都要玩数独。长大后,随着科技的进步,我们可以让计算机来帮我们解数独了!只需要点击数独的图片,它就会为你填满全部九宫格。 叮~ 这里有一份数独解析教程,等

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]  

完成以上步骤后,数独网格看起来是这样的:

干货 | 手把手教你用115行代码做个数独解析器!

提取的数独

第三步:用回溯算法计算数独的解

我们将使用回溯算法来计算数独的解。

在网格中搜索仍未分配的条目。如果找到引用参数行,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。

(编辑:应用网_阳江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读