@author: ZZQ

@software: PyCharm

@file: leetcode37_solveSudoku.py

@time: 2018/11/20 16:41

思路:递归回溯

首先,设置空矩阵bool_col,bool_row和bool_rect分别用于记录每一行,每一列,每个小方块里面已经被填进去的数字

然后,用回溯填空,如果填写的数组满足要求,则返回True,否则返回False. 直至便利完整个数组board。

import numpy

class Solution():
def __init__(self):
pass def solveSudoku(self, board):
"""
:type board: List[List[str]]
:rtype: void Do not return anything, modify board in-place instead.
"""
# 记录每一行,每一列,每个小方块里面已经被填进去的数字
bool_col = numpy.zeros(shape=(9, 9)) # [[0] * 9] * 9
bool_row = numpy.zeros(shape=(9, 9))
bool_rect = numpy.zeros(shape=(9, 9))
for i in range(9):
for j in range(9):
if board[i][j] != '.':
bool_col[i][ord(board[i][j])-ord('0')-1] = 1
bool_row[j][ord(board[i][j])-ord('0')-1] = 1
bool_rect[i/3*3+j/3][ord(board[i][j])-ord('0')-1] = 1 self.dfs(board, bool_col, bool_row, bool_rect, 0, 0)
return board # 回溯
def dfs(self, board, bool_col, bool_row, bool_rect, i, j):
while board[i][j] != '.': # 找空位置
j += 1
if j >= 9:
i += 1
j = 0
if i >= 9:
return True
for number in range(1, 10):
if bool_col[i][number-1] != 1 and bool_row[j][number-1] != 1 and bool_rect[i/3*3+j/3][number-1] != 1:
board[i][j] = str(number)
bool_col[i][number-1] = 1
bool_row[j][number-1] = 1
bool_rect[i / 3 * 3 + j / 3][number-1] = 1
if self.dfs(board, bool_col, bool_row, bool_rect, i, j):
return True
else: # 回溯,当前值不行,继续换下一个值进行尝试
board[i][j] = '.'
bool_col[i][number-1] = 0
bool_row[j][number-1] = 0
bool_rect[i / 3 * 3 + j / 3][number-1] = 0
return False if __name__ == "__main__":
answer = Solution()
for i in answer.solveSudoku([
["5", "3", ".", ".", "7", ".", ".", ".", "."],
["6", ".", ".", "1", "9", "5", ".", ".", "."],
[".", "9", "8", ".", ".", ".", ".", "6", "."],
["8", ".", ".", ".", "6", ".", ".", ".", "3"],
["4", ".", ".", "8", ".", "3", ".", ".", "1"],
["7", ".", ".", ".", "2", ".", ".", ".", "6"],
[".", "6", ".", ".", ".", ".", "2", "8", "."],
[".", ".", ".", "4", "1", "9", ".", ".", "5"],
[".", ".", ".", ".", "8", ".", ".", "7", "9"]
]):
print(i)

Leetcode——37.解数独 [##]的更多相关文章

  1. Java实现 LeetCode 37 解数独

    37. 解数独 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗实 ...

  2. [leetcode] 37. 解数独(Java)(dfs,递归,回溯)

    37. 解数独 1A 这个题其实15分钟左右就敲出来并且对了...但是由于我输错了一个数..导致我白白debug一个多小时.. 没啥难度,练递归-dfs的好题 class Solution { pri ...

  3. leetcode 36 有效的数独 哈希表 unordered_set unordersd_map 保存状态 leetcode 37 解数独

    leetcode 36 感觉就是遍历. 保存好状态,就是各行各列还有各分区divide的情况 用数组做. 空间小时间大 class Solution { public: bool isValidSud ...

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

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

  5. leetcode刷题-37解数独

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

  6. 【LeetCode】解数独

    做题之前先复习下[STL中的Tuple容器] 我们知道,在Python中,大家都知道tuple这个概念,是一个只读的元素容器,容器内的元素数据类型可以不同,而在CPP中大部分的容器只能储存相同数据类型 ...

  7. [leetcode]37. Sudoku Solver 解数独

    Write a program to solve a Sudoku puzzle by filling the empty cells. A sudoku solution must satisfy  ...

  8. [LeetCode] Sudoku Solver 解数独,递归,回溯

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

  9. LeetCode37 使用回溯算法实现解数独,详解剪枝优化

    本文始发于个人公众号:TechFlow,原创不易,求个关注 数独是一个老少咸宜的益智游戏,一直有很多拥趸.但是有没有想过,数独游戏是怎么创造出来的呢?当然我们可以每一关都人工设置,但是显然这工作量非常 ...

随机推荐

  1. AIX平台安装Oracle11gR2数据库

    1. 前提条件 1.1 认证操作系统 Certification Information for Oracle Database on IBM AIX on Power systems(Doc ID ...

  2. kubernetes lable 操作

    我们要给已创建的Pod“redis-master”添加一个标签role=master: $ kubectl label pod redis-master role=master 查看该Pod的Labe ...

  3. WorldWind源码剖析系列:图像助手类ImageHelper

    图像助手类ImageHelper封装了对各种图像的操作.该类类图如下. 提供的主要处理方法基本上都是静态函数,简要描述如下: public static bool IsGdiSupportedImag ...

  4. jqgrid 配置分页大小及下拉项

    如何配置分页大小的下拉项?显示效果如下: 通过 rowNum 来设置默认分页大小 通过 rowList 来设置分页下拉.   rowList 的值为一个数组,比如:[10,20,30] $(" ...

  5. Features + Git + Drush,打造你的Drupal开发与维护标准工作流

    还在为如何将本地的开发工作如何部署到生产环境而皱眉头?本文以实战历程教你如何一步步将你的工作成果从开发环境部署到生产环境. 如题所示,需要用到Features, Git, Drush:如果你还不知道他 ...

  6. odoo开发历史订单需求整体思路

    第一步:找到客户对应页面,并找到他所下过的销售订单,用数据库语句查出所有数据,并去除重复数据,显示在前端, sql="select DISTINCT t2.product_id as pro ...

  7. 20155216 Exp2 后门原理与实践

    后门原理与实践 实验内容: 常用后门工具 NC 或 netcat netcat是一个底层工具,进行基本的TCP UDP数据收发.常被与其他工具结合使用,起到后门的作用. Linux: 一般自带netc ...

  8. 20155229《网络对抗技术》Exp4:恶意代码分析

    实验内容 使用schtasks指令监控系统运行 schtasks指令:允许管理员在本地或远程系统上创建计划任务. SCHTASKS /Create [/S system [/U username [/ ...

  9. 20155317 王新玮《网络对抗技术》实验5 MSF基础应用

    20155317 王新玮<网络对抗技术>实验5 MSF基础应用 1. MS08_067安全漏洞 原理:攻击者利用受害者主机默认开放的SMB服务端口445,发送特殊RPC请求,通过MSRPC ...

  10. 20155318 Exp1 PC平台逆向破解(5)M

    20155318 Exp1 PC平台逆向破解(5)M 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入 ...