문제 링크 :https://www.acmicpc.net/problem/5014
문제 난이도: 골드 5
알고리즘 : bfs (너비 우선 탐색)
문제해결 아이디어: 시작층과 목표층이 주어지고 엘레베이터로 갈수 있는 UP 시 몇층을 한번에 올라갈 수 있는지 Down일때 몇층을 한번에 내려갈 수 있는지가 나온다.
시작층->목표층까지 갈수 있는 버튼수의 최솟값을 구하는 문제 이기 때문에 ->bfs로 풀었다.
UP으로 갈수 있는 값과 Down으로 갈수 있는 값을 벡터에 저장하고 인덱스 0 즉 가장 첫번째 값이 UP버튼으로 갈수 있는 값, 인덱스 1번이 Down버튼으로 갈수 있는 값으로 지정했다.
시작층을 bfs의 매개변수로 넣어 bfs함수가 실행되도록 작성했다.
<오류기록>
문제해결코드:
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
int f,s,g,u,d;
vector<int>dir;
int res=987654321;
int vis[1000001];
void bfs(int s){
//큐의 처음 값은 현재 층이고
//큐의 두번째 값은 해당층 까지 가기위해 버튼을 누른 횟수이다.
queue<pair<int, int>>q;
q.push({s,0});
vis[s]=1;
while(!q.empty()){
int cur=q.front().first;
int cnt=q.front().second;
q.pop();
if(cur==g){
res=cnt;
break;
}
if(dir[0]+cur<=f&&vis[dir[0]+cur]==0){
q.push({dir[0]+cur,cnt+1});
vis[dir[0]+cur]=1;
}
if(cur-dir[1]>=1&&vis[cur-dir[1]]==0){
q.push({cur-dir[1],cnt+1});
vis[cur-dir[1]]=1;
}
}
}
int main(){
cin.tie(0);
cout.tie(0);
std::ios::sync_with_stdio(false);
cin>>f>>s>>g>>u>>d;
//맨 앞이 up값
dir.push_back(u);
dir.push_back(d);
bfs(s);
if(res!=987654321){
cout<<res<<"\n";
}else {
cout<<"use the stairs"<<"\n";
}
return 0;
}