algorithm/문제
[Python]백준 9663번/N-Queen/백트래킹
유랄라-
2023. 3. 31. 16:02
반응형
https://www.acmicpc.net/problem/9663
9663번: N-Queen
N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
⚡️ 문제 설명
N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제
퀸을 놓는 방법의 수를 구하는 프로그램
⚡️ 해결 방법
퀸이 서로 공격할 수 없도록 하는 방법
1. 같은 행에 위치하면 안됨
2. 같은 열에 위치하면 안됨
3. 대각선상에 위치하면 안됨
graph_col 은 X행에서 퀸이 놓인 열의 위치를 저장할 것이다.
queen을 놓은 뒤 이 queen의 자리가 promising 한지 확인해야한다.
이를 확인하는 함수가 promising 함수이다.
이 방식으로 하면 같은 행에 위치할 queen은 없기 때문에 같은 행인지 체크는 하지 않아도 된다.
나머지 같은 열에 위치하는지 graph_col[before_row] == graph_col[row]
대각선상에 위치하는지 abs(graph_col[before_row]-graph_col[row])==abs(before_row-row))
확인한다.
⚡️ 코드
import sys
input = sys.stdin.readline
n = int(input())
def promising(row):
for before_row in range(row):
# 같은 열 or 같은 대각선 상에 있는 경우
if(graph_col[before_row] == graph_col[row] or
abs(graph_col[before_row]-graph_col[row])==abs(before_row-row)):
return False
return True
result = 0
graph_col = [0] * n
def dfs(row):
global result
if row == n:
result += 1
else:
for i in range(n):
# Queen 놓기
graph_col[row] = i
if promising(row):
dfs(row+1)
dfs(0)
print(result)
반응형