1) 기본가정: 같은 행에 Queen을 놓지 않는다.
2) 유망한 노드인지 확인하는 함수
- 같은 열이나 같은 대각선에 놓이는지 확인 -> 해당되면 유망하지 x
- 같은 열 체크: col[i] == col[j]
- 같은 대각선 체크: abs(col[i]-col[j]) == i-j
#include<iostream>
using namespace std;
int col[15];
int N;
int cnt = 0;
bool promising(int i) {
for (int j = 0; j < i; j++) {
if (col[j] == col[i] || abs(col[i] - col[j]) == (i - j)) return false;
}
return true;
}
void dfs(int i) { //i는 놓은 queen의 수이기도 하면서 행을 뜻한다.
if (i == N) cnt++;
else {
for (int j = 0; j < N; j++) {
col[i] = j;
if (promising(i)) dfs(i + 1);
}
}
}
int main() {
cin >> N;
dfs(0);
cout << cnt;
return 0;
}
'Programming > BOJ' 카테고리의 다른 글
[백준/C++] 1929번: 소수 구하기 (여러가지 소수 판별법) (0) | 2020.11.25 |
---|---|
[백준/C++] 9095번: 1,2,3 더하기 (DFS/DP) (0) | 2020.11.25 |
[백준/C++] 1182번: 부분수열의 합 (DFS) (0) | 2020.11.24 |
[백준/C++] 1966번: 프린터 큐 (우선순위 큐) (0) | 2020.09.15 |
[백준/C++] 1874번: 스택수열 (0) | 2020.09.15 |