数独的解法

数独的规则

在 9×9 的方格里面填写数字 1-9,满足

  • 每行不重复
  • 每列不重复
  • 9 个 3×3 的小方格不重复

回溯法

通过 DFS 遍历尝试每一个数字 根据三条规则,可以用三个二维数组记录每行,每列和每个小方格可填数字状态

row = [[True]*9 for _ in range(9)] col = [[True]*9 for _ in range(9)] block = [[True]*9 for _ in range(9)]

row[i][j]表示第i行是否可以填数字j col[i][j]表示第i列是否可以填数字j block[i][j]表示第i个方格是否可以填数字j

用二维数组g表示数独方格的原始状态,0表示空白

def dfs(): # 遍历所有位置 for i in range(9): for j in range(9): # 空白位置 if g[i][j]==0: # 尝试每一个数字 for k in range(9): # 数字满足行,列,块 if row[i][k] and col[j][k] and block[3*(i//3)+j//3][k]: # 填入数字 row[i][k] = col[j][k] = block[3*(i//3)+j//3][k]= False g[i][j] = k+1 if(dfs()): return True # 有填错的,删除数字 row[i][k] = col[j][k] = block[3*(i//3)+j//3][k]= True g[i][j] = 0 # 九个数字都不能填 return False # 所有位置都填了数字 return True

回溯法要注意如何进行记录状态,要方便更新,回溯

参考资料

[1]数独求解算法(回溯法和唯一解法)java 实现