The n-queens puzzle is the problem of placing n queens on an n x n chessboard such that no two queens attack each other.

Given an integer n, return the number of distinct solutions to the n-queens puzzle.

Idea

Backtracking, place row by row and store used columns, left and right diagonals

class Solution:
    def totalNQueens(self, n: int) -> int:
        ans = 0
        
        def backtrack(columns, left_diagonals, 
                      right_diagonals, row, queens_to_place):
            nonlocal ans
            for col in range(n):
                # Don't use same column and diagonal
                if (col in columns or 
                    row - col in left_diagonals or 
                    row + col in right_diagonals):
                    continue
                
                # Place the queen
                columns.add(col)
                left_diagonals.add(row - col)
                right_diagonals.add(row + col)
                
                if queens_to_place == 1:
                    # Queens are placed 
                    ans += 1  
                else:
                    # Place the next queen
                    backtrack(columns, left_diagonals, 
                              right_diagonals, row + 1, queens_to_place - 1)
                
                # Backtrack
                columns.remove(col)
                left_diagonals.remove(row - col)
                right_diagonals.remove(row + col)
        
        backtrack(set(), set(), set(), 0, n)
        return ans