알고리즘/백준
[백준 18235] 지금 만나러 갑니다 (C++)
라이언납시오
2021. 12. 2. 19:11
728x90
반응형
문제 링크: https://www.acmicpc.net/problem/18235
18235번: 지금 만나러 갑니다
첫 번째 줄에 세 정수 N, A, B가 주어진다. (2 ≤ N ≤ 500,000, 1 ≤ A, B ≤ N, A ≠ B)
www.acmicpc.net
1. 주의할 점
- 구간은 [1,len]이다
- 같은 점을 다른 Day에 방문할 수 있다
Ex)
구간: [1,10]
시작위치: 5
목표위치: 4
방법1: 5 → 4
방법2: 5 → 6 → 4
방법3: 5 → 6 → 8 → 4
각 방법으로 5→4로 갈 수 있는 날은 1,2,3일에 모두 도달 가능
2. 구현
- Arr[] 배열을 통해 해당 위치에 방문한 날을 적는다
- Info 구조체를 이용하여 현재 위치, 날, 점프 거리를 담는다
- Queue를 통해 BFS를 수행하여 현 위치를 기준으로 좌우 방향으로 움직였을 때, 같은 날 움직여서 도착할 수 있는 곳이 있다면 종료한다
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
struct info{
int curLoc,day,jump;
};
int arr[500001];
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int len,a,b,result=-1;
cin>>len>>a>>b;
queue<info> q;
q.push({a,0,0});
q.push({b,0,0});
while(!q.empty()){
int cc = q.front().curLoc;
int cd = q.front().day;
int cj = q.front().jump;
q.pop();
int dist = cj==0?1 : cj*2;
int next = cc+dist;
if(next<=len){ //우측 이동
if(arr[next]==cd+1){
result=cd+1;
break;
}
else{
arr[next]=cd+1;
q.push({next,cd+1,dist});
}
}
next = cc-dist;
if(next>0){ //좌측 이동
if(arr[next]==cd+1){
result=cd+1;
break;
}
else{
arr[next]=cd+1;
q.push({next,cd+1,dist});
}
}
}
cout<<result;
return 0;
}
728x90
반응형