코딩공작소

[백준]사다리조작(second) 본문

알고리즘/그리디&완탐

[백준]사다리조작(second)

안잡아모찌 2019. 9. 5. 21:31

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

 

15684번: 사다리 조작

사다리 게임은 N개의 세로선과 M개의 가로선으로 이루어져 있다. 인접한 세로선 사이에는 가로선을 놓을 수 있는데, 각각의 세로선마다 가로선을 놓을 수 있는 위치의 개수는 H이고, 모든 세로선이 같은 위치를 갖는다. 아래 그림은 N = 5, H = 6 인 경우의 그림이고, 가로선은 없다. 초록선은 세로선을 나타내고, 초록선과 점선이 교차하는 점은 가로선을 놓을 수 있는 점이다. 가로선은 인접한 두 세로선을 연결해야 한다. 단, 두 가로선이 연속하거나 서로

www.acmicpc.net

#완전탐색을 이용해 최소 값(단계)을 찾는 문제  : 원래는 if len==M : Return 방식으로 길이를 도달했을 때 종료를 해주었다.

그래서 for문을 통해 끝점을 늘려주면서 if문 안에서 처리를 해주었었다..

하지만, 멍청한 방식이었다... ㅠㅠ

그냥 길이에 상관없이 완전탐색을 하면서 바로바로 진행을 해주고 최대 제한깊이 까지 갔을 때 return을 해주면 된다..

그리고 이 방식은 끝없이 깊어지는 것을 방지하기 위해 가지치기가 필수이다. (시간초과 발생방지)

 

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, ans=4;
bool a[30][10];
 
bool ladder() {
    for (int i=0; i<n; i++) {
        int k=i;
        for (int j=0; j<h; j++) {
            if (a[j][k]) k += 1;
            else if (k > 0 && a[j][k-1]) k -= 1;
        }
        if (i != k) return false;
    }
    return true;    
}
 
void solve(int cnt, int x) {
    if (ans <= cnt) return//가지치기. 이미 최소를 구하면 뒤는 노필요
    if (ladder()) {
        ans = cnt;
        return;
    }
    if (cnt == 3return//3개의 사다리를 했으므로 더 할필요 X
    for (int i=x; i<h; i++) {
        for (int j=0; j<n-1; j++) {
            if(!a[i][j]) {
                a[i][j] = 1;
                solve(cnt+1, i);
                a[i][j] = 0;
            }
        }
    }
}
 
int main() {
    scanf("%d %d %d"&n, &m, &h);
    for (int i=0; i<m; i++) {
        int x, y;
        scanf("%d %d"&x, &y);
        a[x-1][y-1= 1//왼 -> 오 , 의 사다리라고 ㅐㅇ각
    }
    solve(00);
    printf("%d\n", ans == 4 ? -1 : ans);
    return 0;
}
 
cs

'알고리즘 > 그리디&완탐' 카테고리의 다른 글

[SWEA]벌꿀채취  (0) 2019.10.12
[SWEA]디저트카페(2)  (0) 2019.10.10
[백준]일곱난쟁이  (0) 2019.08.20
[백준]Maaaaaaaaaaze  (0) 2019.08.16
[백준]배열돌리기4  (0) 2019.08.12