например,
import random grid=[[5,3,.,.,7,.,.,.,.], [6,.,.,1,9,5,.,.,.], [.,9,8,.,.,.,.,6,.], [8,.,.,.,6,.,.,.,3], [4,.,.,8,.,3,.,.,1], [7,.,.,.,2,.,.,.,6], [.,6,.,.,.,.,2,8,.], [.,.,.,4,1,9,.,.,5], [.,.,.,.,8,.,.,7,9]] def find_empty_position(grid): for r in range(9): for w in range(9): if grid[r][w] == .: return (r, w) def get_row(values, pos): for i in range(9): if i==pos[0]: return values[i] def get_col(values, pos): r, w = pos return [values[r][w] for i in range(9)] def get_block(values, pos): pos=r,w a = 3 * (r%3) b =3 * (w%3) return [values[a+r][b+w] for r in range(3) for w in range(3)] def find_possible_values(grid, pos): check_col=get_col(grid,pos) check_row=get_row(grid,pos) check_block=get_block(grid,pos) n=random.randint(1,9) if n not in check_block: if n not in check_row: if n not in check_col: return n def solve(grid): pos=find_empty_position(grid) if not pos: return grid r,w=pos for n in find_possible_values(grid, pos): grid[r][w] = n if solve(grid): s=solve(grid) return s else: grid[r][w] = . if not pos: return grid