• 递归和回溯_leetcode37


    class Solution(object):
    def solveSudoku(self, board):
    """
    :type board: List[List[str]]
    :rtype: void Do not return anything, modify board in-place instead.
    """


    self.m = len(board)
    self.n = len(board[0])

    self.visit = [[False for i in range(self.n)] for i in range(self.m)]

    # wrong
    self.direction = [[-1,0],[0,1],[1,0],[0,-1]]

    self.count = 0

    self.startX = None
    self.startY = None

    for x in range(self.m):
    for y in range(self.n):
    if board[x][y] == ".":
    self.count += 1
    if not self.startX and not self.startY :
    self.startX = x
    self.startY = y


    self.putNumber(board,self.startX,self.startY)



    def inArea(self,x,y):
    return x >= 0 and x < self.m and y >= 0 and y < self.n


    def putNumber(self,board,x,y):


    self.visit[x][y] = True

    for i in range(1,10):

    if self.validRow(board,x,i) and self.validCol(board,y,i) and self.validSquare(board,x,y,i):

    board[x][y] = str(i)
    self.count -= 1

    if self.count == 0:
    print board

    for item in self.direction:
    newX = x + item[0]
    newY = y + item[1]

    if self.inArea(newX,newY) and not self.visit[newX][newY] and board[newX][newY] == ".":

    self.putNumber(board,newX,newY)


    board[x][y] = "."
    self.count -= 1


    self.visit[x][y] = False
    return


    def validRow(self,board,x,num):

    for i in range(self.n):
    if board[x][i] == str(num):
    return False
    return True


    def validCol(self,board,y,num):
    for i in range(self.m):
    if board[i][y] == str(num):
    return False
    return True

    def validSquare(self,board,x,y,num):

    xIndex = x / 3
    yIndex = y /3

    sX = xIndex * 3
    sY = yIndex * 3

    for i in range(3):
    for j in range(3):
    if board[sX+i][sY+j] == str(num):
    return False
    else:
    return True


    class Solution2(object):
    def solveSudoku(self, board):
    """
    :type board: List[List[str]]
    :rtype: void Do not return anything, modify board in-place instead.
    """

    self.m = len(board) self.n = len(board[0]) self.res = [] self.count = 0 pointSet = [] for x in range(self.m): for y in range(self.n): if board[x][y] == ".": pointSet.append([x,y]) self.putNumber(board,pointSet,0) def inArea(self,x,y): return x >= 0 and x < self.m and y >= 0 and y < self.n def putNumber(self,board,pointSet,index): if index == len(pointSet): for i in range(self.m): self.res.append(board[i][0:]) return True x = pointSet[index][0] y = pointSet[index][1] for i in range(1,10): if self.validRow(board,x,i) and self.validCol(board,y,i) and self.validSquare(board,x,y,i): board[x][y] = str(i) if self.putNumber(board,pointSet,index+1): return board[x][y] = "." return def validRow(self,board,x,num): for i in range(self.n): if board[x][i] == str(num): return False return True def validCol(self,board,y,num): for i in range(self.m): if board[i][y] == str(num): return False return True def validSquare(self,board,x,y,num): xIndex = x / 3 yIndex = y /3 sX = xIndex * 3 sY = yIndex * 3 for i in range(3): for j in range(3): if board[sX+i][sY+j] == str(num): return False else: return Trues = Solution2()# board1 = [# ["5","3","."],# ["6",".","."],# [".","9","8"]# ]board2 = [["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"]]s.solveSudoku(board2)print s.res
  • 相关阅读:
    易联云-打印机
    通俗易懂了解Vue中nextTick的内部实现原理
    题解 CF1556E 【Equilibrium】
    题解 P6087 【[JSOI2015]送礼物】
    Redisson分布式锁源码分析
    Java代理模式
    java 8 去重
    jdk 8 list 转map Duplicate key WmSoDetail
    前端单点登录(SSO)
    Linux基础02 bash shell(命令补全, 快捷键, 历史命令, 命令别名alias, ls, man), 目录管理
  • 原文地址:https://www.cnblogs.com/lux-ace/p/10556925.html
Copyright © 2020-2023  润新知