我刚开始学习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。