https://www.acmicpc.net/problem/16928
16928번: 뱀과 사다리 게임
첫째 줄에 게임판에 있는 사다리의 수 N(1 ≤ N ≤ 15)과 뱀의 수 M(1 ≤ M ≤ 15)이 주어진다. 둘째 줄부터 N개의 줄에는 사다리의 정보를 의미하는 x, y (x < y)가 주어진다. x번 칸에 도착하면, y번 칸으
www.acmicpc.net
풀이
DP로 풀려했으나 DAG가 아니라서 DP를 적용하기 어렵다는 게시글을 보았다...
최단거리이기 때문에 BFS로 해결하면 된다.
1. 이때, 사다리나 뱀을 만나면 무조건 그 위치로 이동(셋 중 하나만 push 해야 함)하는 것에 주의해야한다.
2. 새로운 도착 방법의 주사위 굴리는 횟수가 기존보다 더 적은지 비교해 참이라면 업데이트 하고 다시 push 한다.
#include <iostream>
#include <unordered_map>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
int N, M, a, b;
/*
사다리만 타면서 도착
*/
int dp[101];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
// freopen("input.txt", "r", stdin);
cin >> N >> M;
unordered_map<int, int> ladder;
unordered_map<int, int> snake;
vector<int> ch(101, 2147000000);
for (int i=0; i<N; i++){
cin >> a >> b;
ladder[a]=b;
}
for (int i=0; i<M; i++){
cin >> a >> b;
snake[a]=b;
}
queue<int> q;
q.push(1);
ch[1]=0;
while (!q.empty()){
int v = q.front();
q.pop();
for (int i=1; i<=6; i++){
int nv = v+i;
if (nv > 100) continue;
// 만날 수 있는건 셋중 하나임
if (ladder.find(nv)!=ladder.end()){
if (ch[ladder[nv]] > ch[v]+1) {
ch[ladder[nv]]=ch[v]+1;
q.push(ladder[nv]);
}
}
if (snake.find(nv)!=snake.end()){
if (ch[snake[nv]]>ch[v]+1) {
ch[snake[nv]]=ch[v]+1;
q.push(snake[nv]);
}
}
if (ladder.find(nv)==ladder.end() && snake.find(nv)==snake.end()){
if (ch[nv] > ch[v]+1){
ch[nv]=ch[v]+1;
q.push(nv);
}
}
}
}
cout << ch[100] << endl;
return 0;
}
'백준' 카테고리의 다른 글
[C++] 백준 9019번 DSLR (0) | 2023.02.01 |
---|---|
[C++] 백준 17626 Four Squares (0) | 2023.01.31 |
[C++] 백준 16236 아기 상어 (0) | 2023.01.31 |
[C++] 백준 14500번 테트로미노 (0) | 2023.01.31 |
[C++] 백준 7569번 토마토 (0) | 2023.01.28 |