Click here to Skip to main content
15,891,943 members
Please Sign up or sign in to vote.
1.00/5 (1 vote)
See more:
#sudoku game in python
# Source: Tech with tim, Solve sudoku via backtracking

board = [
    [7,8,0,4,0,0,1,2,0],
    [6,0,0,0,7,5,0,0,9],
    [0,0,0,6,0,1,0,7,8],
    [0,0,7,0,4,0,2,6,0],
    [0,0,1,0,5,0,9,3,0],
    [9,0,4,0,6,0,0,0,5],
    [0,7,0,3,0,0,0,1,2],
    [1,2,0,0,0,7,4,0,0],
    [0,4,9,2,0,6,0,0,7]
]

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)
    return None

def solve(bo):

    print(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 col
    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

print_board(board)
solve(board)
print("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
print_board(board)


What I have tried:

Basically , i was just randomly searching for youtube videos to learn a sudoku algorithm for python and i found this code,
So , i understand most of all but attempt a question while trying to understand this line

#check row
   for i in range(len(bo[0])):
       if bo[pos[0]][i] == num and pos[1] != i:
           return False


what does bo[pos[0]][i] really mean and why pos[1] != i ?

I think i missed some conceptual facts but i'm not sure guys.
Posted
Updated 12-Dec-20 1:36am

1 solution

bo[      ]      Access an array element at...
   pos[0]       ... the index given by the at element at index zero of array pos ...
          [i]   ... as the X coordinate, and the loop variable as the Y

The rest of it? Go back to the site you found the code on and read his explanation, or ask him a question - he will know his code better than we will, and explains the algorithm before he gets to the code.
 
Share this answer
 
Comments
Wong Zi Ao 12-Dec-20 7:37am    
Thank you ! I have understand a step more on the code based on your explanations. The rest i will figure it out.
OriginalGriff 12-Dec-20 7:55am    
You're welcome!

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900