문제링크
https://www.acmicpc.net/problem/25319
25319번: Twitch Plays VIIIbit Explorer
첫 번째 줄에는 던전의 세로 길이 N, 가로 길이 M, 그리고 아이디의 길이 |S|가 공백으로 구분되어 주어진다. (2≤N,M≤50; 1≤|S|≤1000) 두 번째 줄부터 다음 N개의 각 줄
www.acmicpc.net
풀이
최단거리로 이동할 필요가 없고 방문했던 지점도 방문해도 되므로 (+ 제일 많이 걸려도 (N+M) * 1000 < 1e6)
s 문자열 차례대로 최대 강화 횟수 c 만큼 움직이며 아이템 주우면 된다
c 구하기
- s의 각 알파벳마다 floor(던전 알파벳 개수 / s 안에서 알파벳 개수) 의 최댓값
주의
- 마지막에 오른쪽 아래로 이동해야함
- c 가 0 일 수도 있음(강화안하고 탈출만 함)
코드
#include <bits/stdc++.h> using namespace std; #define all(v) (v).begin(), (v).end() #define rall(v) (v).rbegin(), (v).rend() #define ll long long #define ld long double typedef pair<int, int> pi; typedef vector<int> vi; typedef vector<pair<int, int> > vpi; typedef vector<vector<int>> vvi; typedef pair<ll, ll> pl; typedef tuple<ll, ll, ll> t; typedef vector<ll> vl; typedef vector<pair<ll, ll>> vpl; typedef vector<vector<ll>> vvl; typedef vector<string> vs; int dr[4] = {0, 0, 1, -1}; int dc[4] = {1, -1, 0, 0}; // loops #define FOR(i, a, b) for (int i = (a); i < (b); ++i) #define F0R(i, a) FOR(i, 0, a) #define ROF(i, a, b) for (int i = (b)-1; i >= (a); --i) #define R0F(i, a) ROF(i, 0, a) #define rep(a) F0R(_, a) #define each(a, x) for (auto &a : x) int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); #if !defined(ONLINE_JUDGE) freopen("../input.txt", "r", stdin); freopen("../output.txt", "w", stdout); #endif // ONLINE_JUDGE int n, m, slen; cin >> n >> m >> slen; vector<vpi> v(26); for (int i = 0; i < n; ++i) { string tmp; cin >> tmp; for (int j = 0; j < m; ++j) { v[tmp[j] - 'a'].push_back({i, j}); } } string s; cin >> s; vi cnt(26); each(e, s) cnt[e - 'a']++; int ansC = 1e9; each(e, s) ansC = min(ansC, (int)v[e - 'a'].size() / cnt[e - 'a']); string l = ""; auto move = [&](pi& cur, pi& target) { int dr = target.first - cur.first; int dc = target.second - cur.second; char rc = (dr > 0) ? 'D' : 'U'; char cc = (dc > 0) ? 'R' : 'L'; dr = abs(dr); dc = abs(dc); rep(dr) l += rc; rep(dc) l += cc; }; pi cur = {0, 0}; for (int i = 0; i < ansC; ++i) { for (int j = 0; j < s.size(); ++j) { pi target; target = v[s[j] - 'a'].back(); v[s[j] - 'a'].pop_back(); move(cur, target); l += 'P'; cur = target; } } pi tmp = {n - 1, m - 1}; move(cur, tmp); cout << ansC << ' ' << l.size() << '\n'; cout << l; }
728x90
'PS > BOJ' 카테고리의 다른 글
백준 25321번: yo, i herd u liek ternary operators, so.. (C++) (0) | 2023.06.29 |
---|---|
백준 25320번: SCV 체인 (C++) (0) | 2023.06.27 |
백준 25317번: functionx (C++) (0) | 2023.06.22 |
백준 25315번: N수매화검법 (C++) (0) | 2023.06.16 |
백준 1441번: 나누어 질까 (C++) (0) | 2023.06.13 |