[C++][Baekjoon][Backtracking] 9663λ² N-Queen νμ΄
λ°±νΈλνΉ(Back Tracking)
- μμ νμμμ λΆνμν λΆκΈ°(Branch)λ₯Ό κ°μ§μΉκΈ°(Pruning)
- ν΄λ₯Ό μ°Ύλ λμ€ ν΄κ° μλμ΄μ λ§νλ©΄, λλμκ°μ λ€μ ν΄λ₯Ό μ°Ύμκ°λ κΈ°λ²
μ¦, Backtrackingμ΄λ, κ°λ¨νκ² λ§ν΄ brute-force(μ λΆ μΌμΌν λ€ ν΄λ³΄λ κ²)λ°©λ²μ μννμ§λ§ νμ ν¨μ(bounding function)μ μ΄μ©ν΄ κ²½μ°μ μλ₯Ό μ€μ¬λκ°λ λ°©λ²μ λ§νλ€.
[κ΄λ ¨λ¬Έμ ]
9663λ²: N-Queen
N-Queen λ¬Έμ λ ν¬κΈ°κ° N × NμΈ μ²΄μ€ν μμ νΈ Nκ°λ₯Ό μλ‘ κ³΅κ²©ν μ μκ² λλ λ¬Έμ μ΄λ€. Nμ΄ μ£Όμ΄μ‘μ λ, νΈμ λλ λ°©λ²μ μλ₯Ό ꡬνλ νλ‘κ·Έλ¨μ μμ±νμμ€.
www.acmicpc.net
[νμ΄]
1μ°¨μ νμ΄ int queen_col[15] μ μ΄μ©ν΄μ νΈμ μμΉλ₯Ό μ μ₯νλ€.
μ΄ λ, queen_colμ indexλ νμ μλ―Ένκ³ , μμ κ°λ€μ μ΄μ μλ―Ένλ€.
νΈμ μμΉλ₯Ό μ μ₯ν λ λ€μ 2κ°μ 쑰건문μ νμ©ν΄μ queenμ λμ μ μλμ§ μλμ§λ₯Ό νλ¨νλ€.
1. queen_col[col] == queen_col[row]
0 1 2 3 <- νμ μλ―Έ
γ
γ
γ
γ
<- μ΄μ μμΉλ₯Ό μλ―Έ
queenμ κ°μ μ΄/ν μμ λμ΄λ©΄ μλλ―λ‘
colμ +1 ν΄μ£Όλ©° λλ©΄μ queen_colμ κ°μ κ°μ΄ μ μ₯λμ΄ μλμ§λ₯Ό νμΈνλ€.(κ°μ κ°μ΄ μλ€λ©΄, κ°μ μ΄μ μλ€λ μλ―ΈλκΉ)
2. abs(queen_col[row] - queen_col[col]) == (row - col)
0 1 2 3 <- νμ μλ―Έ
γ
γ
γ
γ
<- μ΄μ μμΉλ₯Ό μλ―Έ
queen_col[]λ queen_colμ λ€μ΄μλ κ°μ΄λ―λ‘ μ΄μ μλ―Ένκ³
row, colμ inxexμ΄λ―λ‘ νμ μλ―Ένλ€.
νμ¬μ’νμ λκ°μ μ’νμ μ΄μ μ°¨μ νμ μ°¨κ° κ°λ€λ©΄ λκ°μ μ μμΉν κ²μ μλ―Ένλ€.
μλ₯Ό λ€μ΄ νμ¬ μ’νλ 0,0 μ΄κ³ , νμ¬ μ’νμ λκ°μ μ’νλ 1,1 μΌ λ,
κ°κ° μ΄μ μ΄κ°λλ‘, νμ νκ°λλ‘ λΉΌλ©΄ 0 - 1 == 0 - 1 μ΄ μ±λ¦½ν¨μ μ μ μλ€.
[μ½λ]
#include <iostream>
using namespace std;
void N_Queen(int);
int N;//λ¬Έμ μμ μ£Όμ΄μ§λ κ²μνμ ν¬κΈ°
int queen_col[15];//νΈμ μ΄μμΉλ₯Ό μ μ₯ν λ°°μ΄(queen_colμ μΈλ±μ€λ μμ°μ€λ νμ μλ―Ένκ² λλ€)
int answer;//νΈμ λμ μ μλ κ°μ
bool isEmpty(int);//ν, λκ°μ μ Queenμ΄ μλμ§ νμνλ ν¨μ
int main() {
cin >> N;
N_Queen(0);//1. 0νλΆν° νμ λ° Queen λκΈ° μμ
cout << answer;//7. μ λ΅ μΆλ ₯
return 0;
}
void N_Queen(int row) {
if (row == N) {//2. νμ¬ νμνλ νμ΄ λ§μ§λ§ νμ λλ¬νλ€λ©΄ queenμ λͺ¨λ λ°°μΉνλ€λ λ»μ΄λ―λ‘ answer + 1 ν΄μ£ΌκΈ°
answer++;
return;//β
λμ΄μ νμνμ§ μκ³ λ¦¬ν΄(bounding function)
}
for (int col = 0; col < N; ++col) {//3. queenμ λμ μ μλμ§ μ΄ νμ
queen_col[row] = col;//4. λ£μ μ μλ queenμ μ리λ₯Ό μ μ₯ν¨
if (isEmpty(row)) {//5. μλμ λκ°μ μ΄ λΉμ΄μλμ§ νμ
N_Queen(row + 1);//6. Queen λκ³ λ€μ ν νμνλ¬ gogo
}
}
}
bool isEmpty(int row) {
for (int col = 0; col < row; col++) {//5-1. 0νλΆν° νμ¬ νκΉμ§ κ²ΉμΉλ Queenμ΄ μλμ§ νμνλ€.
if (queen_col[row] == queen_col[col] //5-2. κ°μ μ΄μ μλμ§ νμ
|| abs(queen_col[row] - queen_col[col]) == (row - col)) {//5-3. λκ°μ μ μλμ§ νμ
return false;//β
Queenμ λμ μ μλ€λ©΄ λμ΄μ νμνμ§ μκ³ return(bounding function)
}
}
return true;
}