题目:
编写一个程序,通过已填充的空格来解决数独问题。
一个数独的解法需遵循如下规则:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
空白格用 '.' 表示。

一个数独。

答案被标成红色。
Note:
给定的数独序列只包含数字 1-9 和字符 '.' 。
你可以假设给定的数独只有唯一解。
给定数独永远是 9x9 形式的。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sudoku-solver
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
个人思路:
想着按上一题的大致思路去做,果然错了。。
官方答案推荐:
回溯法
python代码:
class Solution:
def solveSudoku(self, board: List[List[str]]) -> None:
"""
Do not return anything, modify board in-place instead.
"""
def backtrace(row,col):
#换行
if col == 9:
return backtrace(row+1,0)
#遍历完毕,结束
if row == 9:
return True
#有数了,直接下一个
if board[row][col] != '.':
return backtrace(row,col+1)
for curNum in range(1,10):
#不符合“独”,换数试
if not isValid(row,col,curNum):
continue
board[row][col] = str(curNum)
#以这个符合条件的数为基础,再试下一个位置
if(backtrace(row,col+1)):
return True
#后面的数不符合,回溯,返回原状后换一个数继续试
board[row][col] = '.'
#所有数都试过都不行,上一个数要进行回溯换数
return False
#上一题的东西,换了一种简单的写法
def isValid(row,col,curNum) :
curNum = str(curNum)
for i in range(9):
if (board[row][i] == curNum): return False
if (board[i][col] == curNum): return False
if (board[(row//3)*3 + i//3][(col//3)*3 + i%3] == curNum):
return False
return True
backtrace(0,0)
反思:
刚开始看一个说的头头是道的答案是错的,琢磨了两天。。。。一度怀疑自己智商有问题
本文介绍了一种使用回溯法解决数独问题的程序设计思路。通过确保每行、每列及每个3x3宫格内的数字1-9不重复,实现数独的有效求解。文章提供了Python代码实现,并对算法进行了详细解析。

2万+

被折叠的 条评论
为什么被折叠?



