从文本文件读取数独并应用回溯算法的实现疑问
数独文本文件读取与求解方案
首先明确:不需要转JSON,你的文本文件格式有明确规律,直接读取解析即可,比转JSON更高效简单。
实现思路
- 读取文本文件的每一行,跳过开头的注释行(
AME:、TYPE:、COMMENT:这类) - 识别以
SUDOKU开头的行,作为一个数独谜题的起始标记 - 读取该标记后的连续9行,将每行字符串转为整数列表,组成数独的
grid - 对每个解析出的
grid,调用你已有的回溯求解函数 - 格式化输出每个数独的求解结果
完整代码实现
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_box def 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 def load_sudokus_from_file(file_path): sudokus = [] current_grid = [] with open(file_path, 'r') as f: for line in f: line = line.strip() # 跳过空行、注释行和EOF标记 if not line or line.startswith(('AME:', 'TYPE:', 'COMMENT:', 'EOF')): continue # 识别新的数独开始 if line.startswith('SUDOKU'): # 若之前有未完成的grid(理论上不会出现),先保存 if current_grid: sudokus.append(current_grid) current_grid = [] continue # 处理数独的一行,转成整数列表 row = [int(char) for char in line] current_grid.append(row) # 收集满9行时,保存为完整数独 if len(current_grid) == 9: sudokus.append(current_grid) current_grid = [] return sudokus # 主程序执行 if __name__ == "__main__": # 替换为你的数独文件路径 sudoku_file = 'sudokus.txt' sudokus = load_sudokus_from_file(sudoku_file) for idx, grid in enumerate(sudokus, 1): print(f"=== 数独 {idx} 求解结果 ===") # 若需保留原始谜题不被修改,可创建副本: # grid_copy = [row.copy() for row in grid] # solve(grid_copy) solve(grid) for row in grid: print(' '.join(map(str, row))) print()
关键代码解释
load_sudokus_from_file函数:负责文件读取与数独解析- 自动过滤无关行,只处理数独核心数据
- 遇到
SUDOKU X标记时,开始收集下一个数独的9行内容 - 将每行字符串的每个字符转为整数,生成9x9的二维列表(即你的
grid格式)
- 主程序部分:遍历所有解析出的数独,调用求解函数后格式化输出结果
- 若需要保留原始谜题不被修改,可以使用代码中注释的副本创建方式
注意事项
- 确保数独文本文件的路径正确,若文件和代码在同一目录,直接写文件名即可;否则填写完整路径
- 你的回溯求解算法可以直接复用,无需修改
内容的提问来源于stack exchange,提问作者zellez11
相关产品推荐
相关产品推荐

