퀸은 열, 행, 대각의 검사를 통해 있으면 다음검사로 넘어가고 없으면 퀸을 일단 놓고 진행하는 방식이다.
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)
'practivceAlgorithm > 백준' 카테고리의 다른 글
[백준][Python] 14003 가장 긴 증가하는 부분수열 5 : 이분탐색과 인덱스 (0) | 2021.07.29 |
---|---|
[백준][Python] 16940 BFS스페셜저지 (0) | 2021.07.29 |
[백준][Python] 1509 펠린드롬 분할 (0) | 2021.07.29 |
[백준][Python] 1208 부분수열의 합 : 부분수열은 0과1 (0) | 2021.07.29 |
[백준][Python] 15685 드래곤커브 (0) | 2021.07.29 |