๋ฐฑํธ๋ํน(Back Tracking)
- ์์ ํ์์์ ๋ถํ์ํ ๋ถ๊ธฐ(Branch)๋ฅผ ๊ฐ์ง์น๊ธฐ(Pruning)
- ํด๋ฅผ ์ฐพ๋ ๋์ค ํด๊ฐ ์๋์ด์ ๋งํ๋ฉด, ๋๋์๊ฐ์ ๋ค์ ํด๋ฅผ ์ฐพ์๊ฐ๋ ๊ธฐ๋ฒ
์ฆ, Backtracking์ด๋, ๊ฐ๋จํ๊ฒ ๋งํด brute-force(์ ๋ถ ์ผ์ผํ ๋ค ํด๋ณด๋ ๊ฒ)๋ฐฉ๋ฒ์ ์ํํ์ง๋ง ํ์ ํจ์(bounding function)์ ์ด์ฉํด ๊ฒฝ์ฐ์ ์๋ฅผ ์ค์ฌ๋๊ฐ๋ ๋ฐฉ๋ฒ์ ๋งํ๋ค.
[๊ด๋ จ๋ฌธ์ ]
[ํ์ด]
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;
}