파이썬, N Queen 퀸 배치 경우 수 구하는 백트래킹 예제
글. 오상문 sualchi@daum.net
백트래킹은 모든 경우를 검사하다가 더 이상 할 필요가 없으면 그 아래는 생략하고 다음 경우를 검사하는 방법이므로,
전수 조사보다 훨씬 빠른 알고리즘을 구현할 수 있습니다.
N개 퀸(여왕)을 보드(M*N크기)에 배치할 때, 각 퀸은 다음 조건을 만족해야 합니다.
(1) 같은 줄에 다른 퀸이 없어야 한다.
(2) 같은 칸에 다른 퀸이 없어야 한다.
(3) 대각선 칸에 다른 퀸이 없어야 한다.
N Queen 백트래킹 예제 코드는 다음과 같습니다.
xx = [None]*16 # 퀸이 존재하는 칸 저장 (최대 15)
yy = [None]*16 # 퀸이 존재하는 줄 저장 (최대 15)
def go(y, x):
# 백트래킹 가지치기
for i in range(y):
if y == yy[i]: return 0 # 같은 줄에 있으면 그냥 돌아감
if x == xx[i]: return 0 # 같은 칸에 있으면 그냥 돌아감
if abs(x-xx[i]) == abs(y-yy[i]): return 0 # 대각선에 있으면 그냥 돌아감
if y == N-1: # 끝 줄까지 배치가 되었으면 1 반환
return 1
yy[y] = y # 퀸 y 위치 저장
xx[y] = x # 퀸 x 위치 저장
rr = 0 # 가능한 경우 수
for i in range(N): # 아래 줄의 모든 칸 검사
rr += go(y+1, i)
return rr
# -------------- main ----------------------
N = int(input()) # N : 2~15, 퀸 숫자
r = 0 # 퀸 배치 가능한 경우 수
for i in range(N):
r += go(0, i) # 첫줄 모든 칸 검사
print(r)
<이상>
'Python 기초' 카테고리의 다른 글
파이썬, 유효한 괄호쌍 출력하기 (백트래킹) (0) | 2020.07.06 |
---|---|
파이썬, 가능한 N자리 이진수 경우의 수 (백트래킹 이용) (0) | 2020.07.06 |
파이썬, 텍스트 파일 읽기 쓰기 예제 (0) | 2020.02.06 |
파이썬, 람다 함수를 다른 함수의 인수 값으로 전달하는 예제 (0) | 2020.02.05 |
파이썬, 함수를 다른 함수의 인수 값으로 전달하는 예제 (0) | 2020.02.05 |