πŸ•οΈ ICPC Sinchon/Bruteforce

[BOJ S2][C++] λ°±μ€€ 14620번: 꽃길

선달 2022. 9. 24. 15:50
λ°˜μ‘ν˜•

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

 

14620번: 꽃길

2017λ…„ 4μ›” 5일 식λͺ©μΌμ„ λ§žμ΄ν•œ μ§„μ•„λŠ” λ‚˜λ¬΄λ₯Ό μ‹¬λŠ” λŒ€μ‹  ν•˜μ΄ν…Œν¬κ΄€ μ•ž 화단에 꽃을 심어 등ꡐ할 λ•Œ λ§ˆλ‹€ 꽃길을 κ±·κ³  μ‹Άμ—ˆλ‹€. 진아가 가진 κ½ƒμ˜ 씨앗은 꽃을 μ‹¬κ³ λ‚˜λ©΄ μ •ν™•νžˆ 1년후에 꽃이 ν”Όλ―€

www.acmicpc.net

 

문제

2017λ…„ 4μ›” 5일 식λͺ©μΌμ„ λ§žμ΄ν•œ μ§„μ•„λŠ” λ‚˜λ¬΄λ₯Ό μ‹¬λŠ” λŒ€μ‹  ν•˜μ΄ν…Œν¬κ΄€ μ•ž 화단에 꽃을 심어 등ꡐ할 λ•Œ λ§ˆλ‹€ 꽃길을 κ±·κ³  μ‹Άμ—ˆλ‹€.

진아가 가진 κ½ƒμ˜ 씨앗은 꽃을 μ‹¬κ³ λ‚˜λ©΄ μ •ν™•νžˆ 1년후에 꽃이 ν”Όλ―€λ‘œ μ§„μ•„λŠ” λ‹€μŒν•΄ 식λͺ©μΌ λΆ€ν„° 꽃길을 걸을 수 μžˆλ‹€.

ν•˜μ§€λ§Œ μ§„μ•„μ—κ²ŒλŠ” κ½ƒμ˜ 씨앗이 μ„Έκ°œλ°–μ— μ—†μ—ˆμœΌλ―€λ‘œ μ„Έ 개의 꽃이 ν•˜λ‚˜λ„ 죽지 μ•Šκ³  1년후에 κ½ƒμžŽμ΄ λ§Œκ°œν•˜κΈΈ μ›ν•œλ‹€.

꽃밭은 N*N의 격자 λͺ¨μ–‘이고 μ§„μ•„λŠ” 씨앗을 (1,1)~(N,N)의 지점 쀑 ν•œκ³³μ— 심을 수 μžˆλ‹€. κ½ƒμ˜ 씨앗은 κ·Έλ¦Ό (a)처럼 심어지며 1λ…„ ν›„ 꽃이 ν”Όλ©΄ κ·Έλ¦Ό (b)λͺ¨μ–‘이 λœλ‹€.

꽃을 심을 λ•ŒλŠ” μ£Όμ˜ν•  μ μ΄μžˆλ‹€. μ–΄λ–€ 씨앗이 꽃이 ν•€ λ’€ λ‹€λ₯Έ κ½ƒμžŽ(ν˜Ήμ€ κ½ƒμˆ )κ³Ό λ‹Ώκ²Œ 될 경우 두 꽃 λͺ¨λ‘ 죽어버린닀. 또 화단 λ°–μœΌλ‘œ κ½ƒμžŽμ΄ λ‚˜κ°€κ²Œ λœλ‹€λ©΄ κ·Έ 꽃은 죽어버리고 λ§Œλ‹€.

κ·Έλ¦Ό(c)λŠ” μ„Έ 꽃이 μ •μƒμ μœΌλ‘œ ν•€ λͺ¨μ–‘이고 κ·Έλ¦Ό(d)λŠ” 두 꽃이 죽어버린 λͺ¨μ–‘이닀.

ν•˜μ΄ν…Œν¬ μ•ž ν™”λ‹¨μ˜ λŒ€μ—¬ 가격은 격자의 ν•œ μ λ§ˆλ‹€ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— μ§„μ•„λŠ” μ„œλ‘œ λ‹€λ₯Έ μ„Έ 씨앗을 λͺ¨λ‘ 꽃이 ν”Όκ²Œν•˜λ©΄μ„œ κ°€μž₯ μ‹Ό 가격에 화단을 λŒ€μ—¬ν•˜κ³  μ‹Άλ‹€.

단 화단을 λŒ€μ—¬ν•  λ•ŒλŠ” κ½ƒμžŽμ΄ ν•€ λͺ¨μ–‘을 κΈ°μ€€μœΌλ‘œ λŒ€μ—¬λ₯Ό ν•΄μ•Όν•˜λ―€λ‘œ 꽃 ν•˜λ‚˜λ‹Ή 5ν‰μ˜ 땅을 λŒ€μ—¬ν•΄μ•Όλ§Œ ν•œλ‹€.

돈이 λ§Žμ§€ μ•Šμ€ 진아λ₯Ό μœ„ν•˜μ—¬ 진아가 꽃을 심기 μœ„ν•΄ ν•„μš”ν•œ μ΅œμ†ŒλΉ„μš©μ„ κ΅¬ν•΄μ£Όμž!

μž…λ ₯

μž…λ ₯의 첫째 쀄에 ν™”λ‹¨μ˜ ν•œ λ³€μ˜ 길이 N(6≤N≤10)이 λ“€μ–΄μ˜¨λ‹€.

이후 N개의 쀄에 Nκ°œμ”© ν™”λ‹¨μ˜ 지점당 가격(0≤G≤200)이 주어진닀.

좜λ ₯

꽃을 심기 μœ„ν•œ μ΅œμ†Œ λΉ„μš©μ„ 좜λ ₯ν•œλ‹€.

 

풀이

// Authored by : seondal
// Co-authored by : -

// #include <bits/stdc++.h>
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

typedef pair<int,int> p;

vector<vector<int>> input;
vector<vector<p>> successPos;

int dx[] = {0,0,-1,1};
int dy[] = {1,-1,0,0};

// 주어진 벑터에 μžˆλŠ” 씨앗듀이 꽃을 피웠을 λ•Œ λ•… 가격을 κ΅¬ν•˜λŠ” ν•¨μˆ˜
int calcSum(vector<p> v) {
    int sum = 0;
    
    for(int i=0; i<3; i++) {
        p cur = v[i];
        
        sum += input[cur.first][cur.second];  // 씨앗 μœ„μΉ˜ λ•…κ°’ λ”ν•˜κ³ 
        
        // μœ„μΉ˜κ°€ 주어진 μ”¨μ•—μ˜ 꽃 ν”Όμš°κΈ°
        for(int dir=0; dir<4; dir++) {
            int x = cur.first + dx[dir];
            int y = cur.second + dy[dir];
            
            sum += input[x][y];  // κ½ƒμžŽ μœ„μΉ˜ λ•…κ°’ λ”ν•˜κ³ 
        }
    }
    
    return sum;
}

// μ„Έ μ’Œν‘œμ— 씨앗을 μ‹¬μ—ˆμ„ λ•Œ 꽃 κ°œν™”κ°€ μ„±κ³΅ν•˜λŠ”μ§€ 리턴
bool isSucceed(int n, vector<p> &seedpos) {
    vector<vector<bool>> flowerPos (n, vector<bool>(n,false));
    
    // 꽃 μœ„μΉ˜ 벑터에 씨앗 μœ„μΉ˜ ν‘œμ‹œ
    for(int i=0; i<3; i++)
        flowerPos[seedpos[i].first][seedpos[i].second] = true;
    
    // 꽃 ν”Όμš°κΈ°
    for(int i=0; i<3; i++) {
        p cur = seedpos[i];
        
        // (μ”¨μ•—μ˜ μƒν•˜μ’Œμš°μ— μœ„μΉ˜ ν‘œμ‹œ)
        for(int dir=0; dir<4; dir++) {
            int x = cur.first + dx[dir];
            int y = cur.second + dy[dir];
            
            // 꽃이 땅을 λ²—μ–΄λ‚˜κ±°λ‚˜ 이미 꽃이 μžˆμ–΄μ„œ κ²ΉμΉœλ‹€λ©΄
            if(x<0 || x>=n || y<0 || y>=n || flowerPos[x][y])
                return false;
            
            flowerPos[x][y] = true;
        }
    }
    
    return true;
}

int solution (int n) {
    // permutation으둜 쑰합을 κ΅¬ν•˜κΈ° μœ„ν•œ μž„μ‹œ λ°°μ—΄
    int tot = n*n;
    vector<bool> tmp(tot, false);
    tmp[tot-1] = tmp[tot-2] = tmp[tot-3] = true;
    
    do{
        vector<p> seedPos;
        // μ‘°ν•©μœΌλ‘œ 씨앗 μœ„μΉ˜κ°€ 될수 μžˆλŠ” μ’Œν‘œλ“€ κ΅¬ν•΄μ„œ seedPos 벑터에 λ„£κΈ°
        for(int i=0; i<tot; i++) {
            if(tmp[i])
                seedPos.push_back({i/n, i%n});
        }
        
        // 씨앗 심기에 μ„±κ³΅ν•˜λ©΄ successPos에 λ„£κΈ°
        if(isSucceed(n, seedPos))
            successPos.push_back(seedPos);
        
    } while (next_permutation(tmp.begin(), tmp.end()));
    
    // 각 μ‘°ν•©μ˜ λ•…κ°’λ“€μ˜ μ΅œμ†Ÿκ°’ κ΅¬ν•˜κΈ°
    int minCost = 3001;
    for(int i=0; i<successPos.size(); i++) {
        int curCost = calcSum(successPos[i]);
        minCost = min(minCost, curCost);
    }
    
    return minCost;
}
int main() {
    int n;
    cin >> n;
    input.assign(n, vector<int>(n,0));
    for(int i=0; i<n; i++)
        for(int j=0; j<n; j++)
            cin >> input[i][j];
    
    cout << solution(n);
}

/*
 */
λ°˜μ‘ν˜•