practivceAlgorithm/백준
[백준][Python] 9663 N-Queen : 대각선, 열, 행 자료구조 효율적관리
findTheValue
2021. 7. 29. 01:25
퀸은 열, 행, 대각의 검사를 통해 있으면 다음검사로 넘어가고 없으면 퀸을 일단 놓고 진행하는 방식이다.
dfs를 통해 퀸의 갯수가 행의 갯수만큼 놓이면 검사를 결과의 횟수를 하나 추가해주고
dfs의 순회는 매행 1~n번 열의 칸이고
칸을 옮길때마다 isTrue를 통해 checkrow로는 같은 열상에 퀸이 존재하나를 체크,
1~x까지 그동안 순회했던 행들의 인덱스를 통해 대각선 검증까지 해준다.
import sys
input = sys.stdin.readline
n = int(input())
check_row = [0 for _ in range(16)]
result = 0
# 진입한 cnt값의 check[cnt]값은 지금 검사하는 열의 번호.
# 이 열에 check_row[i]즉 같은 열에 퀸이있거나
# 열의 차이=행의차이 즉 대각선 상에 퀸이 있으면 false반환.
def isTrue(x):
for i in range(1, x):
if check_row[x] == check_row[i] or abs(check_row[x] - check_row[i]) == x - i:
return False
return True
def dfs(cnt):
global result
if cnt > n:
result += 1
else:
# 퀸을 행의 1번부터 n번칸까지 놔보며 놓을 수 있나 확인해본다. 놓을 수 있으면 cnt+1 다음행으로 진입.
for i in range(1, n + 1):
check_row[cnt] = i
if isTrue(cnt):
dfs(cnt + 1)
dfs(1)
print(result)