코딩공작소

[백준]꽃길 본문

알고리즘/그래프

[백준]꽃길

안잡아모찌 2019. 8. 9. 21:16

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

 

14620번: 꽃길

2017년 4월 5일 식목일을 맞이한 진아는 나무를 심는 대신 하이테크관 앞 화단에 꽃을 심어 등교할 때 마다 꽃길을 걷고 싶었다. 진아가 가진 꽃의 씨앗은 꽃을 심고나면 정확히 1년후에 꽃이 피므로 진아는 다음해 식목일 부터 꽃길을 걸을 수 있다. 하지만 진아에게는 꽃의 씨앗이 세개밖에 없었으므로 세 개의 꽃이 하나도 죽지 않고 1년후에 꽃잎이 만개하길 원한다. 꽃밭은 N*N의 격자 모양이고 진아는 씨앗을 (1,1)~(N,N)의 지점 중 한곳에 심을 수

www.acmicpc.net

1.dfs를 이용한 완전탐색.

별다른건 없는 문제.

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
48
49
50
51
52
53
54
55
56
57
#include <iostream>
using namespace std;
 
int N, ans = 1e9;
int map[10][10];
int isV[10][10];
int dr[] = { 0,0,1,-1 }, dc[] = { 1,-1,0,0 };
 
bool check(int r, int c) {
    bool flag = true;
    for (int i = 0; i < 4; i++) {
        int nr = r + dr[i], nc = c + dc[i];
        if (isV[nr][nc] == 1) {
            return false;
        }
    }
    return flag;
}
 
void dfs(int r, int len) {
    if (len == 3) { 
        //꽃이 3개가 되면 핀 부분을 더해준다.
        int s = 0;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (isV[i][j] == 1) s += map[i][j];
            }
        }
        if (ans >= s) ans = s;
        return
    }
 
    //외곽에서는 피지못하므로 범위를 잘 정해준다.
    for (int i = r; i < N - 1; i++) {
        for (int j = 1; j < N - 1; j++) {
            if (check(i, j) == true) {
                int nr, nc;
                isV[i][j] = 1;
                for (int k = 0; k < 4; k++) isV[i + dr[k]][j + dc[k]] = 1
                dfs(i, len + 1);
                isV[i][j] = 0;
                for (int k = 0; k < 4; k++) isV[i + dr[k]][j + dc[k]] = 0;
            }
        }
    }
}
 
int main()
{
    cin >> N;
    for (int i = 0; i < N; i++for (int j = 0; j < N; j++cin >> map[i][j];
 
    dfs(10);
    printf("%d\n", ans);
    return 0;
}
 
cs

 

'알고리즘 > 그래프' 카테고리의 다른 글

[백준]구슬탈출2(두번째)  (0) 2019.08.16
[백준]보물섬  (0) 2019.08.16
[백준]게임(미완성)  (0) 2019.08.09
[백준]캐슬디펜스  (0) 2019.08.05
[백준]파이프 옮기기1  (0) 2019.08.05