정답률이 35%라서 약간 쫄았는데... 시간은 2시간 걸렸지만 결국 혼자서 풀어냈다ㅠㅠ
사실 입력을 잘못 받아놓고 있어서 더 빨리 풀었을 수 있었지만 까불지말자
기본적인 BFS이해만 있으면 금방 풀 수 있는 문제이다. 나같은 경우에는 map배열에 각 칸에 뱀과 사다리가 있으면 저장해주었고, dist배열에 해당 번호에 도착할 수 있는 최소 cnt를 저장하였다.
아직도 한 문제에 시간을 너무 쏟는 것 같다. 효율적으로 쓰자
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
int map[101];
int dist[101];
struct Loc {
int dis, cnt;
Loc(int a, int b) {
dis = a;
cnt = b;
}
bool operator<(const Loc& b) const {
return cnt > b.cnt;
}
};
int main() {
ios_base::sync_with_stdio(false);
//freopen("in1.txt", "rt", stdin);
int n, a, b, m;
for (int i = 1; i <= 100; i++) {
dist[i] = 2147000000;
}
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> a >> b;
map[a] = b;
//cout << a << b << '\n';
}
for (int i = 1; i <= m; i++) {
cin >> a >> b;
map[a] = b;
}
priority_queue<Loc> pQ;
pQ.push(Loc(1,0));
dist[1] = 0;
while (!pQ.empty()) {
Loc now = pQ.top();
pQ.pop();
//cout << now.dis << " ";
//if (now >= 100) break;
for (int i = 1; i <= 6; i++) {
int next = now.dis + i;
if (next == 100) {
cout << dist[now.dis] + 1<< "\n";
//for (int k = 1; k <= 100; k++) cout << dist[k] << " ";
return 0;
}
if (map[now.dis] != 0) {
if (dist[map[now.dis]]> dist[now.dis]) {
dist[map[now.dis]] = dist[now.dis];
pQ.push(Loc(map[now.dis], dist[now.dis]));
//if (map[now.dis] == 98) cout << "hi" << map[now.dis] << '\n';
}
break;
}
else {
if (dist[next] > dist[now.dis]+1) {
dist[next] = dist[now.dis] + 1;
pQ.push(Loc(next, dist[next]));
}
}
}
}
//cout << dist[100] << '\n';
return 0;
}