728x90
https://www.acmicpc.net/problem/9663
9663번: N-Queen
N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
전형적인 백트래킹 문제입니다. 다만 조건 시간이 빡빡해 운이 안좋으면 실패, 운이 좋으면 통과라는 어이없는 결과가 나오기도 하는 문제입니다. 저의 경우에는 is_empty 함수의 if queen[row] == queen[i] 조건문이 원래 if queen[i] == queen[row] 였는데 순서를 바꾸어주자 넉넉하게 통과하기도 했습니다. 정확한 이유는 모르겠지만 코드가 맞고 다른 이들과의 코드와 차이를 잘 모르겠다면 이런 저런 시도를 다 해보시면 좋을 것 같습니다.
import sys
# 인덱스에 배치 가능한지 판단하는 함수
def is_empty(row):
# 가로는 할 필요 없음
# 세로, 대각선
for i in range(row):
if queen[row] == queen[i] or abs(queen[i] - queen[row]) == abs(i - row):
return False
return True
# NQueen 재귀 함수
def n_queen(row):
# 마지막 인덱스를 넘어가면
if row == N:
global cnt
cnt += 1
return
else:
# 인덱스를 돌며 탐색
for i in range(N):
# 인덱스에 퀸 배치
queen[row] = i
# 인덱스에 배치 가능하면
if is_empty(row):
# 재귀 호출
n_queen(row+1)
N = int(sys.stdin.readline())
# 카운트
cnt = 0
# 퀸 인덱스
queen = [0] * N
# 함수 호출
n_queen(0)
print(cnt)
728x90
'Coding Test > BaekJoon_Python' 카테고리의 다른 글
백준 2630 <색종이 만들기> Python (0) | 2023.11.29 |
---|---|
백준 16139 <인간-컴퓨터 상호작용> Python (0) | 2023.11.28 |
백준 25192 <인사성 밝은 곰곰이> Python (0) | 2023.11.26 |
백준 7785 <회사에 있는 사람> Python (0) | 2023.11.25 |
백준 13414 <수강신청> Python (1) | 2023.11.25 |