โ 9663 N-Queen โ
#n-queens
#place n queens (not placed in the same row / col / diagonal dir)
def track(x):
global ans
if x == N: #finished
ans+=1
return
else:
for ny in range(N):
if v1[ny] == v2[x+ny] == v3[x-ny] == False:
v1[ny] = v2[x+ny] = v3[x-ny] = True
track(x+1)
v1[ny] = v2[x+ny] = v3[x-ny] = False
N=int(input())
ans=0
v1=[False]*(N) #horizontal 0~(N-1)
v2=[False]*(2*N-1) #diagonal (right->left) 0 ~ 2*N-2
v3=[False]*(2*N-1) #diagonal(left->right) -(N-1) ~ (N-1)
track(0)
print(ans)
๐ NxN ์ฒด์คํ์์ ์/์๋/๋๊ฐ์ ๋ฐฉํฅ์ผ๋ก ๊ฐ์ queen์ด ๋์ด์ง ์๊ฒ ๋ฐฐ์นํ๋ well-known ๋ฌธ์ . ์ฌ๋ฌ ๋ฐฉ๋ฒ ์ค backtracking ๋ฐฉ๋ฒ์ผ๋ก ์งํ. ์ด 3๊ฐ์ visited๋ฅผ ๋ง๋ค์ด tracking ํ๋ค๋ ํน์ idea๊ฐ ํ์. DFS๋ก depth๋ง๋ค ์งํํ๋ฏ๋ก ๊ฐ์ ํ์ ๊ณ ๋ คํ ํ์ ์์. ๊ฐ์ ์ด์ ์๋ ์ง ์์๋ณด๊ธฐ ์ํด y index๋ก ๊ตฌ์ฑ๋ v1 list (0~N-1) / ์ผ์ชฝ ์๋๋ก ํฅํ๋ ๋๊ฐ์ ๋ฐฉํฅ์ ๊ฐ์ด ์๋ ์ง ์์๋ณด๊ธฐ ์ํด v2 list(0~2*N-2): x index์ y index์ ํฉ / ์ค๋ฅธ์ชฝ ์๋๋ก ํฅํ๋ ๋๊ฐ์ ๋ฐฉํฅ์ ๊ฐ์ด ์๋ ์ง ์์๋ณด๊ธฐ ์ํด v3 list(-(N-1)~(N-1)): x index - y index / ์๋ ๊ทธ๋ฆผ์์ ํ๋์ ํ์ดํ v2 list๋ก x์ y ์ขํ์ ํฉ์ด ๋์ผํ ๊ท์น. ๋นจ๊ฐ์ ํ์ดํ v3 list๋ก x - y๊ฐ ๋์ผํ ๊ท์น
→ ํ์ฌ x ์์ ny๋ง 0~N-1๊น์ง ์ด๋ํ๋ฉฐ v1[ny]์ v2[x+ny]์ v3[x-ny]๊ฐ ๋ชจ๋ False์ผ ๊ฒฝ์ฐ๋ง track() ์งํ(์ฌ๊ท ๊ตฌํ). ๊ทธ๋ ์ง ์๋ค๋ฉด backtracking. track() ์ดํ ๋น ์ ธ๋์ฌ ๋ ๋ชจ๋ True ํ์ฒ๋ฆฌ ํ์.
→ trackingํ ๋ ํ์ํ ํต์ฌ์ธ์๋ง ์ต๋ํ ๋๋ ค ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ / ์๊ฐ ์ด๊ณผ ๋ฐฉ์ง
'BOJ > ๐ฅ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
โ Two-Pointers Advanced I - 7 Solvedโ (0) | 2024.02.11 |
---|---|
โ Implementation&Simluation Advanced I - 5 Solvedโ (0) | 2024.01.28 |
โ Backtracking Advanced I - 3 Solvedโ (1) | 2024.01.21 |
โ DP Upper-Advanced I - 8 Solvedโ (1) | 2024.01.05 |
โ Binary Search Advanced I - 2 Solvedโ (0) | 2023.12.29 |
๋๊ธ