from random import* def set_grid(level): grid = [[0]*9 for i in range(9)] n_fill = level rand_el = randint(1, 9) rand_r = randint(0, 8) rand_c = randint(0, 8) while n_fill != 0: while not valid_setting(rand_r, rand_c, rand_el, grid): rand_el = randint(1, 9) rand_r = randint(0, 8) rand_c = randint(0, 8) grid[rand_r][rand_c] = rand_el n_fill -= 1 return grid def valid_setting(r, c, el, grid): if grid[r][c] != 0: return False if el in grid[r]: return False for row in grid: if row[c] == el: return False start_r = r - r % 3 start_c = c - c % 3 for r_idx in range(start_r, start_r + 3): for c_idx in range(start_c, start_c + 3): if grid[r_idx][c_idx] == el: return False return True def print_grid(grid): print() for el in grid: print(el) print() def move_r(r, c): if c == 8: return r + 1 else: return r def move_c(c): if c == 8: return 0 else: return c + 1 def solve(r, c, grid): if r == 9 and c == 0: return True if grid[r][c] != 0: return solve(move_r(r, c), move_c(c), grid) for el in range(1, 10): if valid_setting(r, c, el, grid): grid[r][c] = el if solve(move_r(r, c), move_c(c), grid): return True grid[r][c] = 0 return False def check_solved(gird): for r in range(0, 9): for c in range(0, 9): if not_valid(r, c, grid): return False return True def not_valid(r, c, grid): el = grid[r][c] if el in grid[0:r] + grid[r+1:] : return True for row in range(0, 9): if grid[row][c] == el: if row == r: continue return True start_r = r - r % 3 start_c = c - c % 3 for r_idx in range(start_r, start_r + 3): for c_idx in range(start_c, start_c + 3): if grid[r_idx][c_idx] == el: if r_idx == r and c_idx == c: continue return True return False grid = set_grid(15) print_grid(grid) solve(0, 0, grid) print_grid(grid) print("Sudoku Solved: ", check_solved(grid))
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter