[笔记]解9x9数独

class sudoku:
    def __init__(self, matrix):
        self.matrix = matrix

    def setNum(self, row, col, num):
        self.matrix[row][col] = num

    def initMatrixWithZero(self):
        self.matrix = []
        for i in range(9):
            self.matrix.append([0 for i in range(9)])

    def initMatrixWithString(self, s):
        if not len(s) == 9*9:
            return False
        p = [s[i*9:(i+1)*9] for i in range(9)]
        p = [[int(st[i]) for i in range(9)] for st in p]
        self.matrix = p

    def initMatrixWithInt(self, i):
        return self.initMatrixWithString(str(i))

    def getEmptyCell(self):
        "搜索某个空位以填入数独"
        for row in range(9):
            for col in range(9):
                if self.matrix[row][col] == 0:
                    return row, col

    def solve(self):
        "解决数独"
        if not self.getEmptyCell():
            return True
        r, c = self.getEmptyCell()
        for num in range(1, 10):
            if self.isValid(r, c, num):
                self.matrix[r][c] = num
                if self.solve():
                    return True
                self.matrix[r][c] = 0
        return False
        

    def isValid(self, row, col, num):
        "判断是否能填入"
        s = self.getBlock(self.getStartPos(row, col))
        for i in range(9):
            if self.matrix[row][i] == num or self.matrix[i][col] == num:
                return False
        for n in range(3):
            for m in range(3):
                if s[n][m] == num:
                    return False
        return True

    def getBlock(self, startpos):
        "通过3x3区块的起始位置获取该区块"
        l = [[], [], []]
        for row in range(startpos[0], startpos[0]+3):
            for col in range(startpos[1], startpos[1]+3):
                l[row-startpos[0]].append(self.matrix[row][col])
        return l
    
    def getStartPos(self, row, col):
        "获取某一位置所处的3x3区块的起始位置"
        startRow = (row // 3) * 3
        startCol = (col // 3) * 3
        return startRow, startCol

    def prettyPrint(self):
        "整洁输出"
        for r in self.matrix:
            for c in r:
                print(c, end=' ')
            print()

    

test = [
    [1, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 2, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 3, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 4, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 5, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 6, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 7, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 8, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 9],
]
s = sudoku(test)
s.solve()
s.prettyPrint()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值