맛있는감귤

BOJ : 13913 숨바꼭질4 본문

알고리즘/백준 알고리즘

BOJ : 13913 숨바꼭질4

맛있는감귤 2017. 4. 28. 00:13

문제 : https://www.acmicpc.net/problem/13913

기존 1697 숨바꼭질 과 같은 문제지만 추가로 지나온 경로를 출력을 요구한다는 점에서 차이가 있다.

처음에는 queue에 경로 벡터를 추가해서 노드마다 경로 값을 가지는 무식한 짓을 벌였다.

어처피 목적지에 도달하는 최소 경로중 하나만 출력하면 되기 때문에 배열 하나로 지나온 경로를 관리하는 방법으로 AC를 얻었다.

visited[다음 경로] = 현재 경로  가 된다. 

그리고 목적이에 도달했을 때 목적지에서 출발지까지 뒤로 탐색해 vector에 push한 다음 다시 출력하게 되면 원하는 경로가 출력될 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
 
int px[2]={1,-1};
int N,K,cnt=0;
int visited[100002];
queue<int> q;
int main(){
    scanf("%d%d",&N,&K);
    q.push(N);
    for(int i=0;i<100001;i++)
        visited[i]=-1;
    
    visited[N]=N;
    while(!q.empty()){
        int sz = q.size();
        while(sz--){
            int x = q.front();
            q.pop();
            if(x==K){
                printf("%d\n",cnt);
                vector<int> v;
                int pre = K;
                while(pre!=N){
                    v.push_back(pre);
                    pre = visited[pre];
                }
                printf("%d",N);
                for(int i=v.size()-1;i>=0;i--)
                    printf(" %d",v[i]);
                
                return 0;
            }
            for(int i=0;i<3;i++){
                int nx;
                if(i==2) nx = 2*x;
                else nx = x + px[i];
                if(nx > 100000 || nx < 0continue;
                if(visited[nx]!=-1continue;
                visited[nx]=x;
                q.push(nx);
            }
        }
        cnt++;
    }
}
cs


'알고리즘 > 백준 알고리즘' 카테고리의 다른 글

BOJ : 5214 환승  (2) 2017.04.28
BOJ : 14226 이모티콘  (2) 2017.04.28
BOJ : 14442 벽 부수고 이동하기2  (0) 2017.03.26
BOJ : 9095 1,2,3 더하기  (0) 2017.03.26
BOJ : 11657 타임머신  (2) 2017.03.15