json 从文本文件阅读数独并应用回溯

u3r8eeie  于 2023-03-13  发布在  其他
关注(0)|答案(2)|浏览(122)

我刚刚开始使用python,所以如果这些问题是noob问题或者这些问题已经被回答了,请原谅我。我正在尝试阅读多个数独谜题,并应用我在网上找到的算法。代码使用了网格(list[list[int]])设置。我尝试在网上寻找解决方案,但我发现我应该将.txt文件转换为JSON文件,然后从那里继续。

.txt文件如下所示

  1. AME: sudoku
  2. TYPE: SUD
  3. COMMENT: 5 sudokus
  4. SUDOKU 1
  5. 034000600
  6. 002600080
  7. 068300007
  8. 003001005
  9. 059060072
  10. 000520046
  11. 205906000
  12. 000408050
  13. 000007004
  14. SUDOKU 2
  15. 000504000
  16. 000089020
  17. 785000000
  18. 002346008
  19. 040290050
  20. 860000000
  21. 030007042
  22. 400060805
  23. 608005030
  24. SUDOKU 3
  25. 040000300
  26. 036072000
  27. 078060400
  28. 083000600
  29. 000300005
  30. 025008070
  31. 300004800
  32. 000000024
  33. 764089530
  34. SUDOKU 4
  35. 000074900
  36. 000000046
  37. 079000300
  38. 600728009
  39. 980503000
  40. 037940050
  41. 200000000
  42. 008030060
  43. 060490023
  44. SUDOKU 5
  45. 026030470
  46. 000200510
  47. 700900020
  48. 509000000
  49. 000050000
  50. 000000307
  51. 080009001
  52. 034006000
  53. 095070640
  54. EOF

在线代码

  1. def is_valid(grid, r, c, k):
  2. not_in_row = k not in grid[r]
  3. not_in_column = k not in [grid[i][c] for i in range(9)]
  4. 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)]
  5. return not_in_row and not_in_column and not_in_box
  6. def solve(grid, r=0, c=0):
  7. if r == 9:
  8. return True
  9. elif c == 9:
  10. return solve(grid, r+1, 0)
  11. elif grid[r][c] != 0:
  12. return solve(grid, r, c+1)
  13. else:
  14. for k in range(1, 10):
  15. if is_valid(grid, r, c, k):
  16. grid[r][c] = k
  17. if solve(grid, r, c+1):
  18. return True
  19. grid[r][c] = 0
  20. return False
  21. grid = [
  22. [0, 0, 4, 0, 5, 0, 0, 0, 0],
  23. [9, 0, 0, 7, 3, 4, 6, 0, 0],
  24. [0, 0, 3, 0, 2, 1, 0, 4, 9],
  25. [0, 3, 5, 0, 9, 0, 4, 8, 0],
  26. [0, 9, 0, 0, 0, 0, 0, 3, 0],
  27. [0, 7, 6, 0, 1, 0, 9, 2, 0],
  28. [3, 1, 0, 9, 7, 0, 2, 0, 0],
  29. [0, 0, 9, 1, 8, 2, 0, 0, 3],
  30. [0, 0, 0, 0, 6, 0, 1, 0, 0]
  31. ]
  32. solve(grid)
  33. print(*grid, sep='\n')

我不需要输入静态网格,而是使用.txt文件。我只是找不到任何东西来帮助我解决手头的问题。这可能是因为我是python新手,或者我需要帮助来理解如何转换为JSON文件。
How to convert txt file into json using python?我已经研究过这个问题,但我甚至不确定这是否是正确的方法。
任何反馈都是值得赞赏的,甚至是在正确的方向点头也是有帮助的。

gz5pxeao

gz5pxeao1#

下面是一个示例,说明如何将sudoku文本文件读入list[list[int]]的字典,即dict[str, list[list[int]]]

  1. def read_sudokus(fn: str) -> dict[str, list[list[int]]]:
  2. sudokus = {}
  3. with open(fn) as f:
  4. [next(f) for _ in range(4)] # skip the header
  5. while True:
  6. name = next(f).strip()
  7. if name == 'EOF':
  8. break
  9. sudokus[name] = [list(map(int, next(f).strip())) for _ in range(9)]
  10. next(f) # skip blank line
  11. return sudokus
  12. ss = read_sudokus('sudoku.txt')
  13. print(ss)

输出:

  1. {'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': etc.

当然,这是假设一个9x9的标准数独大小。

展开查看全部
bfnvny8b

bfnvny8b2#

简单的答案是读取txt文件中的行,然后搜索数独,结果如下:

  1. with open('sudoku.txt', 'r') as f:
  2. lines = f.readlines()
  3. puzzles = []
  4. for i, line in enumerate(lines):
  5. sudoku = []
  6. if line.startswith('SUDOKU'):
  7. # next 9 lines will be our puzzle
  8. for j in range(1, 10):
  9. sudoku.append([*lines[i+j].strip()]) # strip gets rid of the newline character, the * splits the string into a list of characters
  10. puzzles.append(sudoku)

谜题列表现在包含了一个列表列表,但是现在所有的字符都是字符串,我将把转换成整数的工作留给你。

相关问题