※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 27451번 문제인 마키마씨가 정해주는 오늘 점심의 맛이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/27451
27451번: 마키마씨가 정해주는 오늘 점심의 맛
파워와 덴지, 아키는 점심을 함께 먹기로 약속했다. 하지만 식당 이름을 착각하는 바람에 셋은 서로 다른 식당에 도착하고 말았다! 세 사람 마인 하나, 무기인간 하나, 사람 하나는 서로 자신이
www.acmicpc.net
문제에 주어진 셋이 같은 걸음수으로 도착할 수 있는 가장 가까운 칸과 그 경로를 출력하는 문제이다.
먼저, 세 명이 식당에 서있을 수 있는 경우의 수는
매 초마다 다음 초에 서있을 수 있는 곳을 단순한 BFS와 같이 각 칸에서 이동할 수 있는 칸을 탐색한다면
또한,
최단경로를 실제로 구해내는 것은 해당 칸으로 오기 위해 이전 초에 있어야 하는 칸 중 하나를 저장하는, 백트래킹을 위한 테이블을 위 과정을 진행하며 채워 구해낼 수 있다.
여담으로 에디토리얼은 문제의 상황을 각자가 서 있는 위치로 나타낸 3-tuple
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
#include <set>
using namespace std;
typedef long long ll;
int N, M;
int A, B, C;
ll edges[45];
ll cur[3], nxt[3];
char backtrack[85185][45][3];
set<pair<ll, pair<ll, ll>>> st;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> M >> A >> B >> C;
while (M--) {
int s, e; cin >> s >> e;
edges[s] |= (1LL << e);
}
cur[0] = (1LL << A), cur[1] = (1LL << B), cur[2] = (1LL << C);
for (int i = 1; i < 85185; i++) {
for (int k = 0; k < 3; k++) {
nxt[k] = 0;
for (int j = 1; j <= N; j++) {
if (cur[k] & (1LL << j)) {
ll tmp = edges[j] & (~nxt[k]);
if (tmp) {
nxt[k] |= tmp;
for (int jj = 1; jj <= N; jj++) {
tmp >>= 1;
if (tmp & 1) backtrack[i][jj][k] = j;
}
}
}
}
cur[k] = nxt[k];
}
ll tmp = cur[0] & cur[1] & cur[2];
if (tmp) {
int idx = 0;
while (!(tmp & (1LL << idx))) idx++;
cout << idx << ' ' << i << '\n';
for (int k = 0; k < 3; k++) {
vector<int> ans;
int pos = idx;
for (int ii = i; ii > 0; ii--) {
ans.emplace_back(pos);
pos = backtrack[ii][pos][k];
}
ans.emplace_back(pos);
while (!ans.empty()) {
cout << ans.back() << ' ';
ans.pop_back();
}
cout << '\n';
}
return 0;
}
pair<ll, pair<ll, ll>> p = make_pair(cur[0], make_pair(cur[1], cur[2]));
if (st.count(p)) break;
st.insert(p);
}
cout << -1;
}
'BOJ' 카테고리의 다른 글
[BOJ 9771 // C++] Word Searching (0) | 2023.02.13 |
---|---|
[BOJ 2033 // C++] 반올림 (0) | 2023.02.13 |
[BOJ 9770 // C++] GCD (0) | 2023.02.13 |
[BOJ 9772 // C++] Quadrants (0) | 2023.02.13 |
[BOJ 2292 // C++] 벌집 (0) | 2023.02.12 |