俄罗斯贵宾会-俄罗斯贵宾会官网
做最好的网站

python 求数独

流程图

图片 1

03

那怎么样来教,小朋友学习数独呢。如果是零基础的孩子,建议还是从最简单的四宫数独来学,这样能通过自己的努力解出来,对树立孩子的自信心是非常有帮助的。同时,因为孩子的注意力比较短,四宫数独通常占用的时间也不多。

当四宫数独能够很快解出来的时候,就可以挑战六宫甚至九宫数独了。但是,要注意,可以每天做1-3道题,但是不能时间过长。如果发现孩子对数独的兴趣比较浓厚,还可以报名参加在北京的数独段位比赛,以及全国中小学数独比赛(已经办到第二届了)。

数独文件

000000002
006002000
000030040
000050000
001000006
000400070
050000000
000003109
470009000

04

为了更好地激发孩子学习的兴趣,家长也可以跟孩子来一场PK,很有意思的呢。

下图是我和孩子PK的数独题。

图片 2

小学甲组题(和孩子PK结果)

代码

class Sudoku:
    ALL = set(range(1, 10))

    def __init__(self, sdk_file):
        self.sdk_matrix = [[int(c) for c in line]
                           for line in sdk_file.read().split("n")] if sdk_file else []

    def get_row(self, row):
        return self.sdk_matrix[row]

    def get_col(self, col):
        return [row[col] for row in self.sdk_matrix]

    def get_matrix(self, row, col):
        sr, sc = (row // 3) * 3, (col // 3) * 3
        for r in range(sr, sr + 3):
            for c in range(sc, sc + 3):
                yield(self.sdk_matrix[r][c])

    def get_avls(self, row, col):
        return self.ALL - (set(self.get_matrix(row, col)) | set(self.get_row(row)) | set(self.get_col(col)))

    def __getitem__(self, n):
        return self.sdk_matrix[n]

    def __str__(self):
        return "n".join([str(row) for row in self.sdk_matrix])

    def clone(self):
        sdk_c = Sudoku(None)
        for row in range(9):
            sdk_c.sdk_matrix.append([])
            for col in range(9):
                sdk_c.sdk_matrix[row].append(self.sdk_matrix[row][col])
        return sdk_c


def get_answer(sdk):
    has_filled, brunch = False, None
    for row in range(9):
        for col in range(9):
            if sdk[row][col] != 0:
                continue
            avls = sdk.get_avls(row, col)
            if len(avls) == 0:
                return False
            elif len(avls) == 1:
                sdk[row][col] = avls.pop()
                has_filled = True
            elif not brunch or len(avls) < len(brunch[0]):
                brunch = (avls, row, col)
    if has_filled:
        answer = get_answer(sdk)
        if answer:
            return answer
    elif brunch:
        for b in brunch[0]:
            sdk_c = sdk.clone()
            sdk_c[brunch[1]][brunch[2]] = b
            answer = get_answer(sdk_c)
            if answer:
                return answer
    else:
        return sdk


with open("4.sdk") as sdk_file:
    sdk = Sudoku(sdk_file)
    answer = get_answer(sdk)
    print(answer)

02

解数独的方法有很多种,最基本的几种是:

1)宫内排除法

2)行列排除法

3)唯一余数法

4)区块排除法

本文由俄罗斯贵宾会发布于编程,转载请注明出处:python 求数独

您可能还会对下面的文章感兴趣: