37. Sudoku Solver

来源:互联网 发布:python http接口 编辑:程序博客网 时间:2024/06/10 04:25
# *-  coding:utf-8  -*'''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.思路:剪枝    使用枚举方法进行递归。    使用三个二维数组分别记录行状态、列状态、九宫格状态;    首先对已经出现的数字进行记录;    从左上角开始依次枚举每个'.'位置的取值,直到最右下角,同时检查    每一行、每一列、每一个九宫格的状态。    i/3*3+j/3表示第几个九宫格,square[i/3*3+j/3][k]表示第i/3*3+j/3    九宫格上的k数字是否已经出现,已经出现记为1,否则记为0;    row[i][k]:第i行的k数字是否出现    column[j][k]:第j列的k数字是否出现'''class Solution(object):    def solveWay(self,i,j):        '''        i:the number of row        j:the number of column        board:List[List[str]]        '''        # print 'i:',i        if i==9:        return True        if j==9:  #换行        return self.solveWay(i+1,0)        if self.board[i][j] != '.':#数字已经存在,左移一个        return self.solveWay(i,j+1)        for k in range(0,9):        # print 'k:',k        if self.row[i][k]==0 and self.column[j][k]==0 and self.square[i/3 * 3 + j/3][k]==0:        self.board[i][j]=str(k+1)        self.row[i][k]=1        self.column[j][k]=1        self.square[i/3*3+j/3][k]=1        if self.solveWay(i,j+1):        return True        self.board[i][j]='.'        self.row[i][k]=0        self.column[j][k]=0        self.square[i/3*3+j/3][k]=0        return False    def solveSudoku(self, board):        """        :type board: List[List[str]]        :rtype: void Do not return anything, modify board in-place instead.        """        self.board = board        self.row=[[0]*9 for x in range(9)]  #行记录        self.column=[[0]*9 for x in range(9)]  #列记录        self.square=[[0]*9 for x in range(9)]  #九宫格记录        for i in range(len(self.board)):     #初始化记录        for j in range(len(self.board[0])):        if self.board[i][j] != '.':        num=ord(self.board[i][j])-49        self.row[i][num]=1        self.column[j][num]=1        self.square[i/3*3+j/3][num]=1        #print 'row', self.row        self.solveWay(0,0)       # print self.board       # print 'row',self.row       # return self.board    mys=Solution()s=[['.']*9 for x in range(9)]print ss=mys.solveSudoku(s)print s