문제

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

걸린 시간

04 : 07 : 56

풀이

C++

#include <bits/stdc++.h>
#define INF 1e9
typedef long long ll;
typedef unsigned long long ull;
using namespace std;

int dice[10];
vector<pair<int, int>> adj[33]; // current point, next index

void makeBoard(){
    // start to 40
    for(int i = 0; i <= 20; i++)
        adj[i].push_back(make_pair(2*i, i+1));
    // blue
    adj[5].push_back(make_pair(10, 22));
    adj[10].push_back(make_pair(20, 25));
    adj[15].push_back(make_pair(30, 27));
    // end
    adj[21].push_back(make_pair(0, 0));
    // 10 to 25
    adj[22].push_back(make_pair(13, 23));
    adj[23].push_back(make_pair(16, 24));
    adj[24].push_back(make_pair(19, 30));
    // 20 to 25
    adj[25].push_back(make_pair(22, 26));
    adj[26].push_back(make_pair(24, 30));
    // 30 to 25
    adj[27].push_back(make_pair(28, 28));
    adj[28].push_back(make_pair(27, 29));
    adj[29].push_back(make_pair(26, 30));
    // 25
    adj[30].push_back(make_pair(25, 31));
    // 25 to 40
    adj[31].push_back(make_pair(30, 32));
    adj[32].push_back(make_pair(35, 20));
}

int solve(int turn, int point, vector<int> piece){
    // 기저 사례
    if(turn == 10) return point;
    // 재귀 호출
    int ret = -INF;
    for(int i = 0; i < 4; i++){
        auto p = piece;
        int cur = p[i];
        if(cur == 21) continue;
        if(cur == 5 || cur == 10 || cur == 15)
            cur = adj[cur][1].second;
        else
            cur = adj[cur][0].second;
        for(int j = 1; j < dice[turn]; j++){
            if(cur == 21) break;
            cur = adj[cur][0].second;
        }
        bool isValid = true;
        for(int j = 0; j < 4; j++)
            if(cur != 21)
                if(piece[j] == cur) isValid = false;
        if(isValid){
            p[i] = cur;
            ret = max(ret, solve(turn+1, point+adj[cur][0].first, p));
        }
    }
    return ret;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    for(auto& i : dice) cin >> i;
    makeBoard();
    vector<int> piece(4, 0);
    cout << solve(0, 0, piece);
    return 0;
}

윷놀이 판을 링크드 리스트로 구현했으면 시간이 이렇게 오래 걸리진 않았을 것 같다.

말의 개수가 4개 뿐이라 위치를 관리하는 배열을 레퍼런스 변수로 사용하지 않았다. (backtracking -> brute force)

'Baekjoon' 카테고리의 다른 글

Baekjoon 1005번 ACM Craft  (0) 2020.11.05
Baekjoon 2564번 경비원  (0) 2020.11.03
Baekjoon 3108번 로고  (0) 2020.11.02
Baekjoon 1194번 달이 차오른다, 가자.  (0) 2020.11.02
Baekjoon 14442번 벽 부수고 이동하기 2  (0) 2020.11.01

댓글