프로그래밍/백준 알고리즘

백준 알고리즘 풀이 5014번 - 스타트링크

good programmer 2019. 9. 16. 17:06

- bfs 알고리즘

 

-시간 복잡도-

O(|V|+|E|)

 

- 알고리즘 -

 

1. 처음 내가 있는 위치를 queue에 넣는다.  

2. U, D을 사용해서 bfs를 돌린다.

3. 원하는 위치에 들어왔다면 종료 후 그 배열 값에 저장된 값을 출력한다.

 

- 예외 조건 -

 

1. bfs를 다 돌렸는데도 G를 방문하지 못했다면 계단으로 가도록 한다.

2. node에 방문하지 않는 조건을 visited [now]가 0일 때로 했으므로 처음에 들어가는 값의 visited는 1로 넣어주고 답에서 1을 빼주어야 한다.

 

계속 메모리 초과가 나와서 이유를 알 수 없었는데, queue에 넣는 조건을 visited [now]가 1일 때로 지정해 놓아서 메모리 오류가 나고 있었다.

새로 알게 된 사실인데 변수 이름을 g, d, u, f, s로 지으면 에러가 나온다. 시스템 변수와 겹치는 걸로 보인다.

 

-소스 코드-

 

#include <iostream>
#include <queue>
#define MAX 1000010

using namespace std;

int F,S,G,U,D;
int visited[MAX]={0,};
queue<int> q;

int bfs()
{
	q.push(S);
	visited[S]=1;
	while(!q.empty()){
		int now=q.front();
		if(now==G) return visited[now]-1;
		q.pop();
		int nextFloor[2]={now+U,now-D};
		for(int i=0;i<2;i++){
			if(1<=nextFloor[i] && nextFloor[i]<=F ){
				if(visited[nextFloor[i]]==0){
					visited[nextFloor[i]]=visited[now]+1;
					q.push(nextFloor[i]);
				}
			}
		}
	}
	return -1;
}

int main()
{
	cin>>F>>S>>G>>U>>D;
	int ans=bfs();
	if(ans==-1){
		cout<<"use the stairs";
	}
	else {
		cout<<ans;
	}
}