티스토리 뷰

728x90

문제 링크

www.acmicpc.net/problem/2159

 

2159번: 케익 배달

첫째 줄에 N이 주어지고 둘째 줄에는 선아가 일하는 레스토랑의 위치가, 셋째 줄부터는 N명의 위치가 X와 Y로 주어진다. 두 좌표 사이에는 공백이 하나 이상 있다.   (1 ≤ N, X, Y ≤ 100,000)

www.acmicpc.net

 

풀이

각 주문마다 해당되는 칸과 인접한 4칸, 총 5칸을 갈 수 있는 상태로 정의합니다.

주문과 주문 사이 갈 수 있는 5*5가지 경우의 수로 모두 전이해주면 됩니다.

 

 

정답 코드

#include <bits/stdc++.h>

#define INF 0x3f3f3f3f3f3f3f3fLL
#define ft first
#define sd second
using namespace std;
using ll = long long;
using pll = pair<ll, ll>;

int n;
ll d[111'111][5];
pll p[111'111];
int dx[] = {0, 0, 1, 0, -1}, dy[] = {0, 1, 0, -1, 0};

ll getDist(ll x1, ll y1, ll x2, ll y2) {
    return abs(x1 - x2) + abs(y1 - y2);
}

ll go(int i, int j, int x, int y) {
    if (i == n) return 0;
    ll &ret = d[i][j];
    if (ret != -1) return ret;
    ret = INF;
    for (int k = 0; k < 5; k++) {
        ll nx = p[i + 1].ft + dx[k];
        ll ny = p[i + 1].sd + dy[k];
        ret = min(ret, go(i + 1, k, nx, ny) + getDist(x, y, nx, ny));
    }

    return ret;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n;
    memset(d, -1, sizeof(d));
    cin >> p[0].ft >> p[0].sd;
    for (int i = 1; i < n + 1; i++) {
        cin >> p[i].ft >> p[i].sd;
    }
    cout << go(0, 0, p[0].ft, p[0].sd);
}
728x90

'알고리즘 > 문제 풀이' 카테고리의 다른 글

[BOJ] 백준 2186 - 문자판  (0) 2021.03.13
[BOJ] 백준 2698 - 인접한 비트의 개수  (0) 2021.03.13
[BOJ] 백준 16287 - Parcel  (0) 2021.03.13
[BOJ] 백준 1019 - 책 페이지  (0) 2021.03.13
[BOJ] 백준 2618 - 경찰차  (0) 2021.03.13
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
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
글 보관함