문제 : https://www.acmicpc.net/problem/9663
import sys
sys.setrecursionlimit(10000)
n = int(sys.stdin.readline())
result = 0
chess = [0] * n
def check(x):
for j in range(x):
if chess[x] == chess[j] or x - j == abs(chess[x] - chess[j]):
return False
return True
def nqueen(r):
global result
if r == n:
result += 1
else:
for i in range(n):
chess[r] = i
if check(r):
nqueen(r+1)
nqueen(0)
print(result)
check 함수를 거치기 전에, 미리 앞에서 거쳤던 열은 그냥 패스하도록 조건 걸어둠.
python3에서는 여전히 시간 초과.. pypy3에서는 그래도 시간이 훨씬 줄어듦. 29372ms -> 16484ms
import sys
sys.setrecursionlimit(10000)
n = int(sys.stdin.readline())
result = 0
chess = [-1] * n
def check(x):
for j in range(x):
if x - j == abs(chess[x] - chess[j]):
return False
return True
def nqueen(r):
global result
if r == n:
result += 1
else:
for i in range(n):
if i in chess: # 앞서 지나갔던 열은 미리 그냥 지나가도록 함.
continue
chess[r] = i
if check(r):
nqueen(r+1)
chess[r] = -1 # 다시 안 씀 처리 해줘야 함.
nqueen(0)
print(result)