首页 > 解决方案 > Python Sudoku:如何实现 for 循环子网格?

问题描述

我正在尝试实现一个函数,该函数获取数独的嵌套列表,如果有效则返回 True,否则返回 False。我实现了行检查和列检查,但子网格检查不起作用。

GRID_SIZE = 9 
SUBGRID_SIZE = 3

def check_grid_if_valid(grid):
    
    gridlist = []
    for i in range(GRID_SIZE):
        # column
        for j in range(GRID_SIZE):
            if grid[j][i] in gridlist and grid[j][i] != None:
                return False
            gridlist.append(grid[j][i])
        gridlist.clear()
        # row        
        for j in range(GRID_SIZE):    
            if grid[i][j] in gridlist and grid[i][j] != None:
                return False
            gridlist.append(grid[i][j]) 
        gridlist.clear()
       
    # it is working now
    # subgrid
    for row in range(0, GRID_SIZE, SUBGRID_SIZE):
        for column in range(0, GRID_SIZE, SUBGRID_SIZE):
            for i in range(row, row + SUBGRID_SIZE):
                for j in range(column, column + SUBGRID_SIZE):
                    if grid[i][j] in gridlist and grid [i][j] != None:
                        return False
                    gridlist.append(grid[i][j])
            gridlist.clear()
     
      
    return True

感谢@OneCricketeer 的帮助!

标签: python

解决方案


尝试以下

for subgrid_col in range(GRID_SIZE, step=SUBGRID_SIZE):
    for subgrid_row in range(GRID_SIZE, step=SUBGRID_SIZE):
        print(f"Checking subgrid ({subgrid_col}, {subgrid_row})") 
        for i in range(SUBGRID_SIZE):
            for j in range(SUBGRID_SIZE):
               num = grid[subgrid_col+i][subgrid_row+j] 

另外,我建议将数字简单地添加到集合而不是列表中,然后在添加所有数字后检查集合的长度是否为 10,而不是在添加数字时检查包含。您也不需要检查in range(1,10)您是否在其他地方限制用户输入;仅当您从不限制输入的外部源读取网格时,才需要进行此检查


推荐阅读