프로그래밍/C++
16928 뱀과 사다리 게임 [c++]
김파츠
2023. 6. 9. 14:10
알고리즘
N과 M을 입력
bfs 시작
1부터 시작하므로 큐에 1-0 (칸-횟수) 삽입
큐에서 팝한 칸을 start 라고 했을 때,
start + 1~6까지의 칸을 탐색.
( 칸 안에는 칸에 도착할 수 있는 최소 횟수)
만약 start + 1~6까지의 칸을 이미 방문했으나(1>= && 지금(start칸 횟수+1)이 작으면 갱신.아니면 밑에꺼 다 패스)
Start + 1~ 6의 칸의 횟수 = Start 칸의 횟수+ 1
만약 start + 1~6이 100이라면
100의 최소 횟수 갱신하기
만약 start + 1~6이 뱀이나 사다리면
이동 한 다음 이동한 칸의 횟수도 Start 칸의 횟수+ 1로 넣기.
큐에 이동한 칸을 넣기
아니면
주사위로 이동한 칸을 넣기
자료구조
map snake,ladder / 시작 칸-도착 칸 이어줌
int IsVisited[] / 인덱스는 칸 번호. 값은 이 칸까지 갈 때 주사위 굴리는 최소 횟수
#include <iostream>
#include <queue>
#include <map>
#define MAX 101
using namespace std;
map<int,int> ladder;
map<int,int> snake;
int isVisited[MAX];
int bfs()
{
int ans = 0;
queue<pair<int,int>> q;
//first : 칸
// second : 이 칸까지 갈수있는 최소 주사위 굴리기횟수
isVisited[1] = 0;
q.push(make_pair(1,0));
while(!q.empty()){
int nowIdx = q.front().first;
int nowNum = q.front().second;
q.pop();
for(int i=1;i<=6;i++){
int tIdx = nowIdx+i;
int tNum = nowNum+1;
if(isVisited[tIdx]>=1&&tNum>isVisited[tIdx])
continue;
if(tIdx == 100){
if(tNum < ans||isVisited[tIdx]==0){
ans = tNum;
isVisited[tIdx] = tNum;
continue;
}
}else if(tIdx>100){
continue;
}
isVisited[tIdx] = tNum;
if(ladder.find(tIdx) != ladder.end()){
tIdx = ladder[tIdx];
isVisited[tIdx] = tNum;
}else if(snake.find(tIdx) != snake.end()){
tIdx = snake[tIdx];
isVisited[tIdx] = tNum;
}
q.push(make_pair(tIdx, tNum));
}
}
return ans;
}
int main(int argc, char *argv[])
{
int N,M;
cin >> N >> M;
//cout << N << M;
for(int i=0;i<N;i++)
{
int a,b;
cin >> a >> b;
ladder.insert({a,b});
}
for(int i=0;i<M;i++)
{
int a,b;
cin >> a >> b;
snake.insert({a,b});
}
cout << bfs();
}