题目链接:Sudoku Solver | LeetCode OJ

Write a program to solve a Sudoku puzzle by filling the empty cells.

Empty cells are indicated by the character '.'.

You may assume that there will be only one unique solution.

A sudoku puzzle...

...and its solution numbers marked in red.

Tags: Backtracking, Hash Table

分析

写程序解数独的基本解法与人类解数独的方法基本相同,都是采用回溯法逐一试探推进。数独初始表格给出后,剩余的空格所有可能的值全排列的结果即为解空间,在解空间中,对每个空格填入一个值进行试探,如果试探后数独表格合法,则这个值被暂时采纳,对下一个格子进行试探。如果下个格子所有可能的值(1~9)尝试后数独表格均不合法,则被暂时采纳的本格子的值试探失败,在本格子中填入下一个值再次进行试探,直到所有的空格都被填入数字,且整张数组表格合法为止。这时表格的状态,即为数独的解。

如果出现所有可能的值都被试探过,而表格仍然不合法,则这个数独无解。

示例

width = 9

class Solution:
def solveSudoku(self, board):
for i in range(width):
for j in range(width):
if board[i][j] != ".":
continue
for k in range(width):
board[i][j] = str(k + 1)
if self.isValidSudoku(board, i, j):
if self.solveSudokuTask(board):
return True
board[i][j] = '.'
return False
return True def isValidSudoku(self, board, x, y):
for i in range(width):
if i != x and board[i][y] == board[x][y]:
return False
for k in range(width):
if k != y and board[x][k] == board[x][y]:
return False
for m in range(3 * (x // 3), 3 * (x // 3 + 1)):
for n in range(3 * (y // 3), 3 * (y // 3 + 1)):
if (m != x and n != y) and board[m][n] == board[x][y]:
return False
return True

Leetcode 笔记系列的Python代码共享在https://github.com/wizcabbit/leetcode.solution

常见问题

  • 在回溯试探的过程中,可以看到判断数独当前状态是否合法是非常重要的环节,我第一反应也是“复用”相关题目Valid Sudoku中的验证方法,但是很快发现会产生严重的算法超时问题。这是因为在这里“暴力”的求解方法中,isValidSudoku函数被调用的次数过大,我随便找了一个数独进行测试,isValidSudoku的执行次数高达21万多次,因此Valid Sudoku中的方法显然需要优化。
  • 分析可知,每次对数独中的一个格子的值进行改变,只会影响其所在行、所在列、所在粗线宫的合法性,因此之前isValidSudoku函数每次遍历整张表格O(n2)的复杂度就显得没有必要。优化后的isValidSudoku函数,只检查必须的检查项时间复杂度从O(n2)降为O(n*3)。在数十万次执行后,总执行时间大大降低。
  • 在调试、上传代码过程中,一定谨慎使用print等输出语句,即使只在isValidSudoku的首行加入一条输出语句也会被执行数十万次,导致实际执行时间严重超时,提交到OJ上基本都会TLE(Time Limit Exceeded)。

相关题目

Valid Sudoku

Leetcode 笔记 36 - Sudoku Solver的更多相关文章

  1. [Leetcode][Python]37: Sudoku Solver

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 37: Sudoku Solverhttps://oj.leetcode.co ...

  2. [leetcode]算法题目 - Sudoku Solver

    最近,新加坡总理李显龙也写了一份代码公布出来,大致瞧了一眼,竟然是解数独题的代码!前几天刚刚写过,数独主要算法当然是使用回溯法.回溯法当时初学的时候在思路上比较拧,不容易写对.写了几个回溯法的算法之后 ...

  3. 【LeetCode】37. Sudoku Solver

    Sudoku Solver Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are i ...

  4. 【leetcode刷题笔记】Sudoku Solver

    Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by th ...

  5. LeetCode 36 Sudoku Solver

    Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by th ...

  6. leetcode problem 37 -- Sudoku Solver

    解决数独 Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated ...

  7. LeetCode OJ:Sudoku Solver(数独游戏)

    Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by th ...

  8. leetcode 37. Sudoku Solver 36. Valid Sudoku 数独问题

    三星机试也考了类似的题目,只不过是要针对给出的数独修改其中三个错误数字,总过10个测试用例只过了3个与世界500强无缘了 36. Valid Sudoku Determine if a Sudoku ...

  9. Leetcode之回溯法专题-37. 解数独(Sudoku Solver)

    Leetcode之回溯法专题-37. 解数独(Sudoku Solver) 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次.数字 1 ...

随机推荐

  1. 在ASP.NET Core中使用百度在线编辑器UEditor

    在ASP.NET Core中使用百度在线编辑器UEditor 0x00 起因 最近需要一个在线编辑器,之前听人说过百度的UEditor不错,去官网下了一个.不过服务端只有ASP.NET版的,如果是为了 ...

  2. 菜鸟学Struts2——零配置(Convention )

    又是周末,继续Struts2的学习,之前学习了,Struts的原理,Actions以及Results,今天对对Struts的Convention Plugin进行学习,如下图: Struts Conv ...

  3. HashMap与TreeMap源码分析

    1. 引言     在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...

  4. Unity 序列化

    Script Serialization http://docs.unity3d.com/Manual/script-Serialization.html 自定义序列化及例子: http://docs ...

  5. geotrellis使用(二十八)栅格数据色彩渲染(多波段真彩色)

    目录 前言 实现过程 总结 一.前言        上一篇文章介绍了如何使用Geotrellis渲染单波段的栅格数据,已然很是头疼,这几天不懈努力之后工作又进了一步,整清楚了如何使用Geotrelli ...

  6. RIFF和WAVE音频文件格式

    RIFF file format RIFF全称为资源互换文件格式(Resources Interchange File Format),是Windows下大部分多媒体文件遵循的一种文件结构.RIFF文 ...

  7. 【C#公共帮助类】 Utils 10年代码,最全的系统帮助类

    为大家分享一下个人的一个Utils系统帮助类,可能有些现在有新的技术替代,自行修改哈~ 这个帮助类主要包含:对象转换处理 .分割字符串.截取字符串.删除最后结尾的一个逗号. 删除最后结尾的指定字符后的 ...

  8. bzoj3208--记忆化搜索

    题目大意: 花花山峰峦起伏,峰顶常年被雪,Memphis打算帮花花山风景区的人员开发一个滑雪项目.    我们可以把风景区看作一个n*n的地图,每个点有它的初始高度,滑雪只能从高处往低处滑[严格大于] ...

  9. java面向对象六原则一法则

    1. 单一职责原则:一类只做它该做的事. 2. 里氏替换原则:子类必须能够替换基类(父类),否则不应当设计为其子类. 3. 依赖倒换原则:设计要依赖于抽象而不是具体化. 4. 接口隔离原则:接口要小而 ...

  10. java中的移位运算符:<<,>>,>>>总结

    java中有三种移位运算符 <<      :     左移运算符,num << 1,相当于num乘以2 >>      :     右移运算符,num >& ...