티스토리 뷰

 

9663번: N-Queen

N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.

www.acmicpc.net

퇴각 검색 알고리즘을 다룰 때 대표적으로 등장하는 문제다. 2차원 배열이 아닌 인덱스를 행, 요소를 열로 사용하는 1차원 배열을 활용하고, PyPy3로 제출해야만 시간초과 없이 AC를 받을 수 있다.

n = int(input())

# 체스판, 0은 아직 놓이지 않음을 의미
map = [0] * n
ans = 0

# 퀸을 놓을 수 있는지 판단하는 함수
def is_satisfy(x):
    for i in range(x):
    
    	# 같은 열에 놓였는지, 대각선에 놓였는지(-> 절댓값으로 판단, 왼쪽 위, 오른쪽 위)
        if map[i] == map[x] or abs(x - i) == abs(map[x] - map[i]):
            return False
    return True

def n_queens(x):
    global ans
    
	# 마지막 행까지 도달하면 경우의 수 + 1, 함수 종료
    if x == n:
        ans += 1
        return
	
    # 퀸을 놓고 해당 퀸의 위치 만족스러운지 확인 후
    # 다음 행으로 넘어감
    for i in range(n):
        map[x] = i
        if is_satisfy(x):
            n_queens(x+1)

n_queens(0)
print(ans)
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함