알고리즘 문제/[백준]

백준 15684 사다리조작

latter2005 2020. 10. 30. 21:56

문제 주소 : www.acmicpc.net/problem/15684

 

15684번: 사다리 조작

사다리 게임은 N개의 세로선과 M개의 가로선으로 이루어져 있다. 인접한 세로선 사이에는 가로선을 놓을 수 있는데, 각각의 세로선마다 가로선을 놓을 수 있는 위치의 개수는 H이고, 모든 세로선

www.acmicpc.net

문제 확인

 

dfs 형태로 문제풀이

최소 개수를 찾는 문제이기 때문에 놓을 사다리 수를 0개부터 4개까지 순서대로 탐색합니다.

 

풀이

 

놓을 사다리 수를 0개부터 탐색하며 가능한 경우를 찾는 즉시 출력합니다.

dfs, 의미없는 탐색을 줄이기 위해 세로 방향 탐색 시 의미가 중복되는 사다리는 넘어갑니다.
//while(!a[i][j - 1] && !a[i][j + 1]) i++;

 

코드

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
38
39
40
41
42
43
44
45
46
47
#include <cstdio>
int N, M, H, m = 4;
bool a[31][11];
bool ch() {//시작점과 끝점이 같은지 확인
    for (int i = 1; i <= N; i++) {
        int t = i;
        for (int j = 1; j <= H; j++) {
            if (a[j][t]) t++;
            else if (a[j][t - 1]) t--;
        }
        if (t != i) return false;
    }
    return true;
}
void dfs(int cn, int mc) {//
    if (m != 4)return;//0개부터 탐색을 하기 때문에 찾는 즉시 모든 dfs 종료
    if (mc == cn) {
        if (ch())
            m = m > cn ? cn : m;
        return;
    }
    for (int j = 1; j < N; j++) {
        for (int i = 1; i <= H; i++) {
            if (a[i][j] || a[i][j + 1|| a[i][j - 1])continue//붙은 사다리 체크
            a[i][j] = 1;
            dfs(cn + 1, mc);
            a[i][j] = 0;
            while (!a[i][j - 1&& !a[i][j + 1]) i++//의미가 중복되는 사다리는 넘어감
        }
    }
}
int main() {
    scanf("%d%d%d"&N, &M, &H);
    for (int i = 0, x, y; i < M; i++) {
        scanf("%d%d"&x, &y);
        a[x][y] = 1;
    }
    for (int i = 0; i < 4; i++) { //최대로 놓을 사다리 수를 0개부터 체크
        dfs(0, i);
        if (m != 4) {
            printf("%d", m);
            break;
        }
    }
    if (m == 4)printf("-1");
 
}
cs
반응형

'알고리즘 문제 > [백준]' 카테고리의 다른 글

[백준] 16235번 나무 재테크  (0) 2020.11.02
백준 16637 괄호 추가하기  (0) 2020.10.30
백준 14500 테트로미오  (0) 2020.10.30
백준 12094: 2048(Hard)  (0) 2020.10.30
백준 16234번: 인구이동  (0) 2020.10.29