class Solution:
def solveNQueens(self, n: int) -> List[List[str]]:
if n == 1:
return [['Q']]
board = [['.'] * n for _ in range(n)]
row = [False] * n
col = [False] * n
diagonal = {i: False for i in range(-(n - 1), n)}
back_diagonal = {i: False for i in range((n - 1) * 2 + 1)}
seen = [[False] * n for _ in range(n)]
res = set()
def dfs(i, j, count):
if count == n:
res.add('|'.join([''.join(t) for t in board]))
return
seen[i][j] = True
if not row[i] and not col[j] and not diagonal[i - j] and not back_diagonal[i + j]:
row[i] = col[j] = diagonal[i - j] = back_diagonal[i + j] = True
board[i][j] = 'Q'
if 0 <= i - 1 < n and not seen[i - 1][j]:
dfs(i - 1, j, count + 1)
if 0 <= i + 1 < n and not seen[i + 1][j]:
dfs(i + 1, j, count + 1)
if 0 <= j - 1 < n and not seen[i][j - 1]:
dfs(i, j - 1, count + 1)
if 0 <= j + 1 < n and not seen[i][j + 1]:
dfs(i, j + 1, count + 1)
board[i][j] = '.'
row[i] = col[j] = diagonal[i - j] = back_diagonal[i + j] = False
if 0 <= i - 1 < n and not seen[i - 1][j]:
dfs(i - 1, j, count)
if 0 <= i + 1 < n and not seen[i + 1][j]:
dfs(i + 1, j, count)
if 0 <= j - 1 < n and not seen[i][j - 1]:
dfs(i, j - 1, count)
if 0 <= j + 1 < n and not seen[i][j + 1]:
dfs(i, j + 1, count)
seen[i][j] = False
dfs(0, 0, 0)
return [t.split('|') for t in res]