16928번 뱀과 사다리 게임

정답률이 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;
}

좋은 웹페이지 즐겨찾기