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

如何在Python数独9x9嵌套列表中检查数字是否在3x3网格内

数独3x3小网格数字检查实现(无函数版)

要检查指定数字是否在目标位置对应的3x3小网格里,核心是先定位该位置所属的3x3网格的起始行和列,再遍历网格内的所有元素对比。

关键逻辑

  • 计算3x3网格的起始行:grid_start_row = rowchoice // 3 * 3(整数除法取整后乘3,得到0、3、6三个起始值)
  • 计算3x3网格的起始列:grid_start_col = columnchoice // 3 * 3
  • 遍历从起始行开始的3行,每行遍历从起始列开始的3列,逐个比对是否存在目标数字

修改后的完整代码

# 棋盘初始化
board = [
 [0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 2, 0, 0, 0, 0, 0, 0, 2],
 [0, 0, 0, 3, 0, 3, 0, 0, 0],
 [0, 0, 5, 0, 0, 0, 0, 0, 0],
 [0, 8, 0, 0, 0, 6, 0, 5, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 2, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 9, 0],
 [0, 0, 0, 1, 0, 0, 0, 0, 0]
]

# 主游戏逻辑
while True:
    print("欢迎来到Python数独游戏")
    print("当前棋盘:")
    for row in board:
        print(row)
    print("请选择要填入数字的行、列,以及要填的数字")
    rowchoice = int(input("请选择行(0-8,0为第一行):"))
    # 输入合法性校验
    if rowchoice > 8 or rowchoice < 0:
        print("无效行号,请重新输入")
        continue
    columnchoice = int(input("请选择列(0-8,0为第一列):"))
    if columnchoice > 8 or columnchoice < 0:
        print("无效列号,请重新输入")
        continue
    guess = int(input("请输入要填的数字(1-9):"))
    if guess > 9 or guess < 1:
        print("无效数字,请重新输入")
        continue
    
    # 检查3x3小网格内是否已存在该数字
    grid_start_row = rowchoice // 3 * 3
    grid_start_col = columnchoice // 3 * 3
    in_grid = False
    # 遍历3x3网格的每一行
    for i in range(grid_start_row, grid_start_row + 3):
        # 遍历当前行的3个列
        for j in range(grid_start_col, grid_start_col + 3):
            if board[i][j] == guess:
                in_grid = True
                break
        if in_grid:
            break
    
    if in_grid:
        print(f"数字{guess}已在当前3x3网格中,无法填入")
    else:
        # 补充数独必需的行、列重复检查
        in_row = guess in board[rowchoice]
        in_col = guess in [board[r][columnchoice] for r in range(9)]
        if in_row:
            print(f"数字{guess}已在当前行中,无法填入")
        elif in_col:
            print(f"数字{guess}已在当前列中,无法填入")
        else:
            board[rowchoice][columnchoice] = guess
            print("数字填入成功!更新后的棋盘:")
            for row in board:
                print(row)

说明

  1. 代码通过整数除法定位目标位置所属3x3网格的起始坐标,再用两层循环遍历网格内所有元素完成重复检查
  2. 补充了数独规则必需的行、列重复检查,若不需要可直接删除这部分逻辑
  3. 全程未使用函数,完全符合需求

内容的提问来源于stack exchange,提问作者DM23545

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 15:19:49