利用回溯算法解数独
小明最近对数独着迷,在玩游戏的时候,计算机程序能够立刻的出答案,好奇的它想知道计算机是怎么得出结果的。数独的游戏规则是根据盘面上的已知数字推理出空格里的数字,要求每一行、每一列、每一个粗线格中均含1~9,且不重复。
问题求解:
面对这样的问题,没有像公式一样的直接解决方式,所以只能靠尝试。就像在走迷宫,没有地图没所以面对每一个岔路口都只能以探索的形式深入,一旦发现路线不对就返回岔路口,选择另一个分支。
把这个比喻用在数独上的话,每一个空格就是一个岔路口,而每一个岔路口都有9种选择。我们肯定末端有一个出口。那么从第一个岔路口出发。假设第1各空格种的数字:1不可以,2也不可以,3可以。
接下来假设第二个空格,1、2、3都不可以,4可以。
这样一直假设下去,如果盘面上的数字相互矛盾则改变上一格的数字,在次尝试,当我们到达最后一个空格并且成功填入数字时,即可输出答案。
注意:输出答案的前提是题目有解。如果题目有两个或更多答案,程序可输出所有答案。
数独解题思路图:
注意:每一次假设后都要把格子还原回0,以便下一次假设时盘面上的数字不冲突。如果不归零,那么可能陷入死局后退回到第一个空格时,第二个空格里已经有了9,这会影响我们的判断。
最终代码:
class Solution():
def solveSudoku(self,board):
self.helper(board,0)
def helper(self,board,index):
if index >= 81: #如果盘面已满
self.printSolution(board) #输出结果
return #返回上一格
if board[index] == 0: #如果当前格为空格
for i in range(1,10): #依次假设1~9
if self.isValid(board,index