从文本文件读取数独并应用回溯算法

我刚开始学习Python,所以如果这些问题看起来很初级,或者这些问题已经有答案,请原谅我。我正在尝试读取多个数独谜题,并应用我在网上找到的算法。代码使用了一个网格(list[list[int]])设置。我尝试在网上寻找解决方案,但找到的都是建议将.txt文件转换为JSON文件,然后再继续操作。

.txt文件看起来像这样

AME: sudokuTYPE: SUDCOMMENT: 5 sudokusSUDOKU 1034000600002600080068300007003001005059060072000520046205906000000408050000007004SUDOKU 2000504000000089020785000000002346008040290050860000000030007042400060805608005030SUDOKU 3040000300036072000078060400083000600000300005025008070300004800000000024764089530SUDOKU 4000074900000000046079000300600728009980503000037940050200000000008030060060490023SUDOKU 5026030470000200510700900020509000000000050000000000307080009001034006000095070640EOF 

网上的代码

def is_valid(grid, r, c, k):    not_in_row = k not in grid[r]    not_in_column = k not in [grid[i][c] for i in range(9)]    not_in_box = k not in [grid[i][j] for i in range(r//3*3, r//3*3+3) for j in range(c//3*3, c//3*3+3)]    return not_in_row and not_in_column and not_in_boxdef solve(grid, r=0, c=0):    if r == 9:        return True    elif c == 9:        return solve(grid, r+1, 0)    elif grid[r][c] != 0:        return solve(grid, r, c+1)    else:        for k in range(1, 10):            if is_valid(grid, r, c, k):                grid[r][c] = k                if solve(grid, r, c+1):                    return True                grid[r][c] = 0        return False        grid = [    [0, 0, 4, 0, 5, 0, 0, 0, 0],    [9, 0, 0, 7, 3, 4, 6, 0, 0],    [0, 0, 3, 0, 2, 1, 0, 4, 9],    [0, 3, 5, 0, 9, 0, 4, 8, 0],    [0, 9, 0, 0, 0, 0, 0, 3, 0],    [0, 7, 6, 0, 1, 0, 9, 2, 0],    [3, 1, 0, 9, 7, 0, 2, 0, 0],    [0, 0, 9, 1, 8, 2, 0, 0, 3],    [0, 0, 0, 0, 6, 0, 1, 0, 0]]solve(grid)print(*grid, sep='\n')

与需要输入的静态网格不同,我希望使用.txt文件。我实在找不到任何帮助我解决当前问题的资源。这可能是因为我刚开始学习Python,或者我需要帮助理解如何将文件转换为JSON格式。

如何使用Python将txt文件转换为json? 我查看了这个,但不确定这是否是正确的做法。

任何反馈都将受到欢迎,甚至是指引正确的方向也很有帮助。


回答:

以下是如何将数独文本文件读取到一个list[list[int]]的字典中,即dict[str, list[list[int]]]的示例:

def read_sudokus(fn: str) -> dict[str, list[list[int]]]:    sudokus = {}    with open(fn) as f:        [next(f) for _ in range(4)]  # 跳过头部        while True:            name = next(f).strip()            if name == 'EOF':                break            sudokus[name] = [list(map(int, next(f).strip())) for _ in range(9)]            next(f)  # 跳过空行    return sudokusss = read_sudokus('sudoku.txt')print(ss)

输出:

{'SUDOKU 1': [[0, 3, 4, 0, 0, 0, 6, 0, 0], [0, 0, 2, 6, 0, 0, 0, 8, 0], [0, 6, 8, 3, 0, 0, 0, 0, 7], [0, 0, 3, 0, 0, 1, 0, 0, 5], [0, 5, 9, 0, 6, 0, 0, 7, 2], [0, 0, 0, 5, 2, 0, 0, 4, 6], [2, 0, 5, 9, 0, 6, 0, 0, 0], [0, 0, 0, 4, 0, 8, 0, 5, 0], [0, 0, 0, 0, 0, 7, 0, 0, 4]], 'SUDOKU 2':  等等。

当然,这假设数独的标准尺寸是9×9。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注