백준/완전 탐색

[백준 14620번 / C++] 꽃길

배발자 2022. 1. 25.

목차

    반응형

    [백준 14620번 / C++] 꽃길

    완전 탐색 문제이다. 

     

    1. dfs 구현은 동일 

    2. 현재 지점에서 상하좌우를 돌아봤을 때 맵을 초과했거나 또는 이미 만개한 꽃잎과 겹치는 부분이 있을 경우 continue

    3. 위의 조건을 통과하였다면 현재위치 포함 상하좌우 모두 visited 라는 배열에 저장 후 dfs 호출 

    4. dfs 호출 이후 코드는 visited 배열을 다시 0으로 초기화. (다른 지역에서 꽃이 필 경우도 모두 탐색해야하기 때문) 

    
      
    #include <iostream>
    #include <algorithm>
    #include <climits>
    int dx[4] = { 0,0,-1,1 };
    int dy[4] = { -1,1,0,0 };
    int n;
    int map[10][10];
    int visited[10][10];
    int result = INT_MAX;
    using namespace std;
    void dfs(int sum, int cnt) {
    if (cnt == 3) {
    result = min(result, sum); return;
    }
    for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
    int check = 0;
    int nx, ny;
    for (int k = 0; k < 4; k++) {
    nx = j + dx[k];
    ny = i + dy[k];
    if (nx < 0 || nx >= n || ny < 0 || ny >= n)continue;
    if (visited[ny][nx])continue;
    check++;
    }
    if (check == 4) {
    int ssum = map[i][j];
    for (int k = 0; k < 4; k++) {
    nx = j + dx[k];
    ny = i + dy[k];
    visited[ny][nx] = 1;
    ssum += map[ny][nx];
    }
    visited[i][j] = 1;
    sum += ssum;
    cnt++;
    dfs(sum, cnt);
    sum -= ssum;
    cnt--;
    for (int k = 0; k < 4; k++) {
    nx = j + dx[k];
    ny = i + dy[k];
    visited[ny][nx] = 0;
    }
    visited[i][j] = 0;
    }
    }
    }
    }
    int main() {
    cin >> n;
    for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
    cin >> map[i][j];
    }
    }
    dfs(0, 0);
    cout << result;
    }

     

     

    14620번: 꽃길

    2017년 4월 5일 식목일을 맞이한 진아는 나무를 심는 대신 하이테크관 앞 화단에 꽃을 심어 등교할 때 마다 꽃길을 걷고 싶었다. 진아가 가진 꽃의 씨앗은 꽃을 심고나면 정확히 1년후에 꽃이 피므...

    www.acmicpc.net

     

    반응형

    '백준 > 완전 탐색' 카테고리의 다른 글

    [백준 2529번 / C++] 부등호  (0) 2022.02.19
    [백준 1107번 / C++] 리모컨  (0) 2022.02.14
    [백준 14502번 / C++] 연구소  (0) 2022.01.28
    [백준 1189번 / C++] 컴백홈  (0) 2022.01.25
    [백준 2589번 / C++] 보물섬  (0) 2022.01.14

    댓글