Home > Baekjoon > N-Queen

N-Queen
10 초 128 MB 47.121%

출처 : N-Queen

Solution
Python

import sys
input = sys.stdin.readline

# 백트래킹 코드
def back(N, y, answer):
    # 이번에 확인하는 퀸이 마지막 퀸이라면, +1
    if y==N:
        return answer+1
    for x in range(N):
        se, sw = y-x, y+x
        # 중복된 x거나, 대각선 위치로 영향 미치는게 있으면 넘김
        if q[x] or seL[se] or swL[sw]: continue
        # 안전위치라면 해당 위치는 방문 체크
        q[x] = seL[se] = swL[sw] = True
        # 다음으로 퀸 놓을 수 있는 위치 확인
        answer = back(N, y+1, answer)
        # 백트래킹으로 진행하니 돌아오면 False로 변경
        q[x] = seL[se] = swL[sw] = False
    return answer
# 퀸은 가로,세로 같은 줄에 한 개씩만 위치할 수 있다.
# → 세로(y) 에 대해서 for 탐색, 가로(x)에 대해서는 겹치지만 않으면 된다.
if __name__ == '__main__':
    N = int(input())
    # 퀸 위치, 남동 대각선(y-x) 유효, 남서(y+x) 대각선 유효 여부 저장
    q, seL, swL = [False]*N, [False]*(N*2-1), [False]*(N*2-1)
    # 백트래킹 돌리고, 결과 출력
    answer = back(N, 0, 0)
    print(answer)

문제

N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다.

N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다. (1 ≤ N < 15)

출력

첫째 줄에 퀸 N개를 서로 공격할 수 없게 놓는 경우의 수를 출력한다.

예제 입력 1

8

예제 출력 1

92

힌트