如何在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)
说明
- 代码通过整数除法定位目标位置所属3x3网格的起始坐标,再用两层循环遍历网格内所有元素完成重复检查
- 补充了数独规则必需的行、列重复检查,若不需要可直接删除这部分逻辑
- 全程未使用函数,完全符合需求
内容的提问来源于stack exchange,提问作者DM23545
相关产品推荐
相关产品推荐

