Algorithm
LeetCode
N-Queen

N Queeen

문제 링크 https://solved.ac/problems/tags/backtracking?sort=solved&direction=desc&page=1 (opens in a new tab)

풀이

풀이 방법의 기본적인 개념은 row[i] = j라면 퀸을 i행 j열에 놓는다는 것이다.

n = int(input())
 
ans = 0
row = [0] * n
 
def is_promising(x):
  for i in range(x):
    '''
    row[x] = 1 row[i] = 1 이라면 둘 다 각자의 행에 1열에 놓았으므로 이는 잘못된 경우가 된다.
    대각선거리는 떨어진 행의 거리만큼 열이 멀다면 대각선상에 존재하는 것이다.
    만약 1행의 2열에 퀸이 있고 3행에서 지워져야 할 대각선 거리는 3 - 1 = 2, 2 + 2 = 4 즉 3행의 4열은 1행 2열의 대각선이 된다.
    '''
    if row[x] == row[i] or abs(row[x] - row[i]) == abs(x - i):
      return False
 
  return True
 
def n_queens(x):
  global ans
  if x == n:
    ans += 1
    return
 
  else:
    for i in range(n):
      row[x] = i
      if is_promising(x):
        n_queens(x + 1)
 
n_queens(0)
print(ans)