N-Queen λ¬Έμ λ ν¬κΈ°κ° N Γ NμΈ μ²΄μ€ν μμ νΈ Nκ°λ₯Ό μλ‘ κ³΅κ²©ν μ μκ² λλ λ¬Έμ μ΄λ€.
Nμ΄ μ£Όμ΄μ‘μ λ, νΈμ λλ λ°©λ²μ μλ₯Ό ꡬνλ νλ‘κ·Έλ¨μ μμ±νμμ€.
첫째 μ€μ Nμ΄ μ£Όμ΄μ§λ€. (1 β€ N < 15)
첫째 μ€μ νΈ Nκ°λ₯Ό μλ‘ κ³΅κ²©ν μ μκ² λλ κ²½μ°μ μλ₯Ό μΆλ ₯νλ€.
μμ μ
λ ₯ 1
8
μμ μΆλ ₯ 1
92
ν΄λΉ λ¬Έμ λ μΌλ°μ μΈ 2μ°¨μ λ°°μ΄ νμμΌλ‘ μκ°μ΄κ³Όλ₯Ό λ§μ λ°©λκ° μλ€.
λ³ΈμΈμ κ²½μ° ν μ΄μ νλμ νΈμ λλλ€λ μ¬κ³ λ°©μμΌλ‘ λλ¦μ μ΅μ νλ₯Ό νλ©° λ°±νΈλνΉνμΌλ μκ° μ΄κ³Ό
ν΄λ΅μ N-Queen λ¬Έμ μ ν¨ν΄μ μλ€.
νΉμ μ’ν (row
, col
)κ° μλ€ κ°μ νμ λ,
row
+col
) μ΄ λͺ¨λ κ°λ€. ex) (0,5) (1,4) (2,3)row
-col
) μ΄ λͺ¨λ κ°λ€. ex) (1,1) (2,2) (3,3)num-1
μ λν΄μ€ κ°μΌλ‘ κ³μ°νλ€.const input = require('fs').readFileSync('/dev/stdin').toString().trim()
const num = Number(input)
const board = Array.from({length: num}, () => Array(num).fill(false))
let result = 0
let cols = new Array(num).fill(false)
// μ‘΄μ¬ν μ μλ λͺ¨λ ν΄λΉ λ°©ν₯μ λκ°μ μλ 2*num-1
let diag1 = new Array(2*num-1).fill(false)
let diag2 = new Array(2*num-1).fill(false)
function isValid(row, col) {
// diag1: μ°μΈ‘ λκ°, diag2: μ’μΈ‘λκ°(row-col μμκ° λμ¬ μ μμΌλ―λ‘, num-1 μΆκ°)
return !(cols[col] || diag1[row+col] || diag2[row-col+num-1])
}
function mineQueen(row) {
if(row === num) {
result++
return
}
for(let i = 0; i < num; i++) {
if(!isValid(row, i)) continue
board[row][i] = true
cols[i] = true
diag1[row+i] = true
diag2[row-i+num-1] = true
mineQueen(row+1)
board[row][i] = false
cols[i] = false
diag1[row+i] = false
diag2[row-i+num-1] = false
}
}
mineQueen(0)
console.log(result)