Sudoku Project

PHOTO EMBED

Thu Feb 09 2023 03:42:57 GMT+0000 (Coordinated Universal Time)

Saved by @Parker_kim #python

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

This program solves sudoku by using recursion!