简体   繁体   中英

Global variable resets in Python

I created a sudoku solver with backtracking algorithm (Python 3.8). It is a recursive algorithm. The sudoku board (puzzle) is a global variable (multiple functions need to share it). The solve() function does its task, but the value of the board doesn't change even after using the global keyword. Your help is needed.

The code:

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

def isPossible(y, x, val): # checks if it is legal to put a value at a certain position
    for row in board: # row condition
        if val == row[x]:
            return False

    for col in board[y]: # column condition
        if val == col:
            return False

    # subcell condition

    subCellRow = (y // 3) * 3
    subCellCol = (x // 3) * 3

    for row in board[subCellRow:subCellRow + 3]:
        for col in row[subCellCol:subCellCol + 3]:
            if val == col:
                return False

    return True

def solve():
    global board
    for y in range(9):
        for x in range(9):
            if board[y][x] == 0:
                for n in range(1, 10):
                    if isPossible(y, x, n): # python stairs
                        board[y][x] = n
                        solve() # recursion starts
                        board[y][x] = 0 # 1-line backtracking algorithm

                return

    printPuzzle() # prints the solved puzzle
    return True

def printPuzzle(): # to display the puzzle
    print()
    for row in board:
        for val in row:
            print(val, end = ' ')

        print()

printPuzzle()
solve()
printPuzzle() # prints the unsolved board

This wasn't the mistake of the global variable, this is happening because there is a slight mistake in your implementation of the algorithm which is reassigning the value to zero at board[y][x] = 0 .

Here is the implementation which I think is correct.

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


def isPossible(y, x, val): # checks if it is legal to put a value at a certain position
    for row in board: # row condition
        if val == row[x]:
            return False

    for col in board[y]: # column condition
        if val == col:
            return False

    # subcell condition

    subCellRow = (y // 3) * 3
    subCellCol = (x // 3) * 3

    for row in board[subCellRow:subCellRow + 3]:
        for col in row[subCellCol:subCellCol + 3]:
            if val == col:
                return False

    return True


def solve():
    global board
    for y in range(9):
        for x in range(9):
            if board[y][x] == 0:
                for n in range(1, 10):
                    if isPossible(y, x, n): # python stairs
                        board[y][x] = n
                        if solve():
                            return True # recursion starts
                        board[y][x] = 0
                return False

    printPuzzle() # prints the solved puzzle

    return True


def printPuzzle(): # to display the puzzle
    print()
    for row in board:
        for val in row:
            print(val, end = ' ')

        print()

printPuzzle()
solve()
printPuzzle() # prints the unsolved board

Output I am getting:

程序输出

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM