문제 링크
C++ (재귀)
#include <bits/stdc++.h>
using namespace std;
bool col[50]; // 퀸 추적
bool diag1[50] , diag2[50] ; // 대각선 추적
int n;
int cnt =0;
void search(int y){
if(y == n){
cnt++;
return;
}
for(int x=0; x<n; x++){ //n번 반복
if(col[x] || diag1[x+y] || diag2[x-y+n-1]) continue;
col[x] = diag1[x+y] = diag2[x-y+n-1] =1;
search(y+1);
col[x] = diag1[x+y] = diag2[x-y+n-1] =0;
}
}
int main(void){
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
search(0);
cout << cnt;
}
💡 (수학적인 개념을 요한다. 그냥 받아들이자.)
x+y 는 왼쪽 아래 대각선을 의미한다. x - y 는 오른쪽 아래 대각선을 의미한다.
따라서 col [] 은 그 좌표의 세로선을 체크하고, diag1[x+y] 는 왼쪽 아래 대각선 체크,
diag2[x-y+n-1] 은 오른쪽 아래 대각선을 체크한다. 이 때 n-1을 더한것은 인덱스가 음수가 되는 것을 방지한다.
x → | |
y ↓ |
C++
#include <bits/stdc++.h>
using namespace std;
bool isused1[40]; // column을 차지하고 있는지
bool isused2[40]; // / 방향 대각선을 차지하고 있는지
bool isused3[40]; // \ 방향 대각선을 차지하고 있는지
int cnt = 0;
int n;
void func(int cur) { // cur번째 row에 말을 배치할 예정임
if (cur == n) { // N개를 놓는데 성공했다면
cnt++;
return;
}
for (int i = 0; i < n; i++) { // (cur, i)에 퀸을 놓을 예정
if (isused1[i] || isused2[i+cur] || isused3[cur-i+n-1]) // column이나 대각선 중에 문제가 있다면
continue;
isused1[i] = 1;
isused2[i+cur] = 1;
isused3[cur-i+n-1] = 1;
func(cur+1);
isused1[i] = 0;
isused2[i+cur] = 0;
isused3[cur-i+n-1] = 0;
}
}
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
func(0);
cout << cnt;
}
'CPP 문제풀이 > 백준' 카테고리의 다른 글
백준 1463번 : 1로 만들기 (DP) (0) | 2020.09.02 |
---|---|
백준 15683번 : 감시 (시뮬레이션) (0) | 2020.09.02 |
백준 15649번 : N과 M (1) (백트래킹)💦 (0) | 2020.09.01 |
백준 1074번 : Z (재귀) 💦 (0) | 2020.09.01 |
백준 11729번 : 하노이 탑 이동순서 (재귀) 💦 (0) | 2020.08.31 |