Back

Sudoku

Python Code:

What I've Learned

I learned that this puzzle game is similar to debugging. One
issue occuring from a line of other issues, making it so that you
have to backtrack and see where the problem begins. The algorithm
here will use all the functions throughout the coding and will
backtrack for me. The 'find' function will allow me to know if
there's been a solution, returning true if there is. Checking each
number 1-9 and entering them into each box to see if it's a valid
entry. If it is a valid entry it'll enter it into the board and keep
trying until one of the entries are correct. Once it goes through
all the valid possiblities and none are true, it will then backtrack
to the last answer to reset because the current answer can't be correct.


# solver.py
def solve(bo):
find = find_empty(bo)
if not find:
return True
else:
row, col = find
for i in range(1,10):
if valid(bo, i, (row, col)):
bo[row][col] = i
if solve(bo):
return True
bo[row][col] = 0
return False




def valid(bo, num, pos):
# Check row
for i in range(len(bo[0])):
if bo[pos[0]][i] == num and pos[1] != i:
return False
# Check column
for i in range(len(bo)):
if bo[i][pos[1]] == num and pos[0] != i:
return False
# Check box
box_x = pos[1] // 3
box_y = pos[0] // 3
for i in range(box_y*3, box_y*3 + 3):
for j in range(box_x * 3, box_x*3 + 3):
if bo[i][j] == num and (i,j) != pos:
return False
return True




def print_board(bo):
for i in range(len(bo)):
if i % 3 == 0 and i != 0:
print("- - - - - - - - - - - - - ")
for j in range(len(bo[0])):
if j % 3 == 0 and j != 0:
print(" | ", end="")
if j == 8:
print(bo[i][j])
else:
print(str(bo[i][j]) + " ", end="")
def find_empty(bo):
for i in range(len(bo)):
for j in range(len(bo[0])):
if bo[i][j] == 0:
return (i, j) # row, col
return None

Now here is where it'll check whether the board is valid or not and
if the number along with the position is also valid. We'll check each
element for the row and see if it is equal to the number we added. You
can not have the same number in a row so we'll check for that and make
a change in our entries if that's the case. The same will happen for each
column as you can not have the same number entry in a single column.
There are nine boxes/sections that contain nine numbers, which also
can't have the same number within any of them. Knowing the box we
want to work on (0,1,2), then having it muliplied by 3 will show which
column and row (position) we are currently working on. It will return
false if we find a duplicate or the entry is invalid, but if we run through
all the checks and it is valid, it will return true.




You want to use the 'def' function to print the game board so we have a
visual of what's happening. After every three rows we want to print a
dashed line to seperate the nine boxes with their nine elements, creating
an organized grid. The 'end' function just makes sure that it doesn't keep
going for the same row but starts a new one after printing nine numbers
across. It also keeps the numbers of each row and column within formation
of the board. The 'find_empty' is for finding a empty square on the board and
checking if it is equal to zero, if it is we'll get a return
of (row,col), (y,x).