You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从文本文件读取数独并应用回溯算法的实现疑问

数独文本文件读取与求解方案

首先明确:不需要转JSON,你的文本文件格式有明确规律,直接读取解析即可,比转JSON更高效简单。

实现思路

  1. 读取文本文件的每一行,跳过开头的注释行(AME:、TYPE:、COMMENT:这类)
  2. 识别以SUDOKU开头的行,作为一个数独谜题的起始标记
  3. 读取该标记后的连续9行,将每行字符串转为整数列表,组成数独的grid
  4. 对每个解析出的grid,调用你已有的回溯求解函数
  5. 格式化输出每个数独的求解结果

完整代码实现

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 01:12:31