python3 특성상 시간초과가 뜰 수 밖에 없고
pypy3로 제출해야.
대각선에 놓는 것은 점과 점을 연결한 기울기가 +1 또는 -1이면 대각선에서 만난다는 성질을 이용했다.
x 좌표는 0,1,2 차례로 늘어나게 했기 때문에 겹치는 것을 생각하지 않았고, y 좌표만 겹치는 지 체크.
arr
은 [1, 3, 2] 와 같은 형태로 queen의 y 좌표만 가지고 있는 리스트. x 좌표는 index 로 구분해줬다.
def check(arr):
x = len(arr)
if x == n:
global count
count += 1
else:
for y in range(n):
if y not in arr and check2(arr, x, y):
check(arr + [y])
# 대각선으로 공격당하지 않는 지 확인 : arr 안의 점들과 새로운 점의 기울기가 +1 or -1 인지 확인하면 된다
def check2(array, x, y):
for i,j in enumerate(array):
if abs(y - j) == abs(x - i):
return False
return True
import sys
from collections import deque
n = int(sys.stdin.readline())
count = 0
check([])
print(count)
메모리 초과가 뜬다.
visit
에 너무 많은 요소가 들어가서인듯.
# 대각선으로 공격당하지 않는 지 확인 : arr 안의 점들과 새로운 점의 기울기가 +1 or -1 인지 확인하면 된다
def check2(array, x, y):
for i, j in enumerate(array):
if abs(y - j) == abs(x - i):
return False
return True
import sys
from collections import deque
n = int(sys.stdin.readline())
count = 0
visit = deque([])
for i in range(n):
visit.append([i])
while visit:
arr = visit.popleft()
if len(arr) == n:
count += 1
else:
x = len(arr)
for y in range(n):
if y not in arr and check2(arr, x, y):
visit.append(arr + [y])
print(count)