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))
Comments