Skip to content

Nqueens

global n
n = 4


def display(board):
    for i in range(n):
        for j in range(n):
            print(board[i][j], end=" ")
        print()


def is_safe(board, row, col):
    # check for up _> row--, col -> i = row (til i >= 0)
    for i in range(row, 0, -1):
        if board[i][col] == 1:  # queen already present
            return False  # can't be placed

    # check for up right -> row--. col++ (i = row, j = col, til i >= 0 and j <= len(board))
    for i, j in zip(range(row, 0, -1), range(col, len(board[0]), 1)):
        if board[i][j] == 1:
            return False

    # check for up left -> row--, col (i >+ 0 and j >= 0
    for i, j in zip(range(row, 0, -1), range(col, 0, -1)):
        if board[i][j] == 1:
            return False

    # else can be placed
    return True


def nqueen(board, row):
    # base case
    if row == len(board):
        display(board)
        return

    # recursive
    for i in range(n):
        if is_safe(board, i, col):
            # place
            board[row][col] = 1
            nqueen(board, row + 1)
            board[row][col] = 0  # backtrack
    # if cant be placed
    return False


def main():
    board = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
    if nqueen(board, 0) == False:
        print("no soln")
        return False
    display(board)
    return True


main()