반응형

문제출처

https://www.acmicpc.net/problem/9663


문제풀이

1
2
3
4
5
6
7
8
9
10
11
12
/**
 * 퀸은 행,열,대각방향으로 공격할 수 있는 기물입니다. 따라서 각 행, 열에는 퀸이 오직 1개만 위치할 수 있습니다.
 * 대각선은 가로의차이가 세로의 차이와 같으면 대각방향에 위치할 수 없는 것으로 판단할 수 있습니다.
 * => 행렬을 그린뒤 row+col의 값을 모두 그려보면 왜 그런지 알 수 있습니다. (row+col)의 값이 대각성분끼리 같습니다.
 * 탐색할 수 있는 경우를 모두 탐색하되 유망한지를 참조하여 탐색합니다.
 * 1차원 배열로 문제를 풀이하는게 처음에 이해가 가지 않았는데 map[0]=1 이라면 0행 1열에 퀸이 위치하는 것을 뜻합니다.
 * 즉, isPromising 함수에서 map[i]와 map[cur]이 같은지 비교하는 것은 같은 열에 위치하는지 체크하는 것을 뜻하며
 * 위에서 설명한 것처럼 대각성분도 체크해주어 현 상태가 유망한지 판단하는 것입니다. 행과 같은 경우는 dfs를 사용하기
 * 때문에 따로 체크를 하지 않고 유망할 경우 다음행을 탐색하는 방법으로 풀이하면 되는 문제입니다.
 * 처음 백트래킹 개념을 이해하지 못해서 직접 풀지는 못한 문제이지만 풀이를 보고 어느정도 백트래킹에대해 알 수 있었던
 * 문제였습니다.
 */
cs


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <cmath>
#define MAX 16
 
using namespace std;
int n,result;
int map[MAX];
 
bool isPromising(int cur) {
    for(int i=0; i<cur; i++) {
        if(map[i] == map[cur] || abs(map[cur]-map[i]) == abs(cur-i)) {
            return false;
        }
    }
    return true;
}
 
void solve(int cur) {
    if(cur==n) {
        result++;
    }
 
    for(int i=0; i<n; i++) {
        map[cur] = i;
        if(isPromising(cur)) {
           solve(cur+1);
        }
    }
}
 
int main() {
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    cin>>n;
    solve(0);
    cout<<result;
    return 0;
}
cs


반응형

'Algorithm' 카테고리의 다른 글

[Programmers] 정렬 - 가장큰수  (0) 2019.01.28
[BOJ 7562] 나이트의 이동  (0) 2019.01.28
[BOJ 2098] 외판원 순회  (0) 2019.01.28
[CodeForce] 158A - Next Round  (0) 2019.01.25
[CodeForce] 71A - Way Too Long Words  (0) 2019.01.25

+ Recent posts