https://www.acmicpc.net/problem/9663
๋ฌธ์
N-Queen ๋ฌธ์ ๋ ํฌ๊ธฐ๊ฐ N × N์ธ ์ฒด์คํ ์์ ํธ N๊ฐ๋ฅผ ์๋ก ๊ณต๊ฒฉํ ์ ์๊ฒ ๋๋ ๋ฌธ์ ์ด๋ค.
N์ด ์ฃผ์ด์ก์ ๋, ํธ์ ๋๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N์ด ์ฃผ์ด์ง๋ค. (1 ≤ N < 15)
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ํธ N๊ฐ๋ฅผ ์๋ก ๊ณต๊ฒฉํ ์ ์๊ฒ ๋๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ถ๋ ฅํ๋ค.
๋ฌธ์ ํํธ์ ํธ์ Show must go on ๋ ธ๋๊ฐ ์๊ธธ๋ ์ ๋๊ฒ ๋ค์ผ๋ฉด์ ํ์์
๋ฐฑ์ค ํฐ์ด ๊ณจ๋4, ์์ ํ์ + ๋ฐฑํธ๋ํน ๋ฌธ์ ์ด๋ค.
์ฒ์์ ๋ฐฑํธ๋ํน ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ๊ธด ํ์์ง๋ง ์ฌ๊ท ๊ณผ์ ์ด ์ ์ดํด๊ฐ ์๋์๋๋ฐ,
์ด๋ค ๋์์์ ์๋ ๊ทธ๋ฆผ์ ๋ณด๊ณ ๋ฐ๋ก ์ดํด๊ฐ ๋์๋ค.
์ฌ๊ท์ ํ๋ฆ๊ณผ ๋๊น์ ๋ฐ๋ก ๋ณผ ์ ์๋ ๊ทธ๋ฆผ์ด๋ค!
main ideas
1. ์ด์ฐจํผ matrix๋ก ๋์ด๋ ๊ฐ์ ํ๊ณผ ์ด์๋ ํธ์ ๋ชป ๋๋ฏ๋ก ์ด์ฐจ์๋ฐฐ์ด์ด ์๋๋ผ ์ผ์ฐจ์ ๋ฐฐ์ด๋ก ํ ์ ์๋ค.
2. ํธ์ด ์๋ ๊ณณ๊ณผ ๊ฐ์ ํ, ๊ฐ์ ์ด, ๋๊ฐ์ ์๋ ๋ค๋ฅธ ํธ์ ๋์ง ๋ชปํ๋ค.
๋ฐ๋ผ์ ์ผ์ฐจ์ ๋ฐฐ์ด์ i ๋ฒ์งธ ์ด์ ํธ์ ๋๊ณ , ์ด์ด ๊ฒน์น๊ฑฐ๋ ๋๊ฐ์ ์ ์๋ค๋ฉด ์ค์งํ๋ค. (backtracking)
์ด๋, ๋๊ฐ์ ํ์ธ์ (x,y) (x+1,y+1) ์ด ๋๊ฐ์ (๊ธฐ์ธ๊ธฐ๊ฐ 1)์์ ์ด์ฉํ๋ค. (x๋ผ๋ฆฌ์ ์ฐจ == y๋ผ๋ฆฌ์ ์ฐจ)
3. canGo() ์์ true๊ฐ ๋ฐํ๋๋ฉด, ๊ทธ ๋ค์ ํ์ผ๋ก ์ด๋ํ๋ค.
๋์ ํธ์ ๊ฐฏ์๊ฐ n๊ฐ๊ฐ ๋๋ฉด answer์ 1๋งํผ ์ฆ๊ฐ์ํจ๋ค.
๋์ ํ์ด
#include <iostream>
using namespace std;
int n;
int line[15] = {0};
int answer = 0;
bool canGo(int x){
for (int i = 0; i < x; ++i){
if(line[x] == line[i]) return false; // y๊ฐ์ด ๊ฐ๋ค?(๊ฐ์ ์ด์ด๋ค?) false
if(abs(line[x]-line[i]) == x-i) return false; // ๋๊ฐ์ ๋ผ์ธ์ด๋ค? false
}
return true;
}
void queen(int x){
if(x==n) {
answer++;
}
else{
for (int i = 0; i < n; ++i){
line[x] = i; // xํ์ i๋ฒ์งธ ์ด์ ํธ ๋๊ธฐ
if(canGo(x)) queen(x + 1);
}
}
}
int main(){
cin >> n;
queen(0);
cout << answer;
return 0;
}
'๐ ์๊ณ ๋ฆฌ์ฆ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C++/BOJ] 9465 : ์คํฐ์ปค (DP) (0) | 2023.03.15 |
---|---|
[C++/BOJ] 10971 : ์ธํ์ ์ํ 2 (์์ ํ์, dfs, Backtracking) (0) | 2023.03.06 |
[C++/BOJ] 1158 : ์์ธํธ์ค ๋ฌธ์ (Queue) (0) | 2023.03.03 |
[C++/BOJ] 7562 : ๋์ดํธ์ ์ด๋ (BFS) (0) | 2023.03.02 |
[C++/BOJ] 1309 : ๋๋ฌผ์ (DP) (0) | 2023.02.23 |