Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 후쿠오카 캐널시티
- BOJ
- 시뮬레이션
- 완전탐색
- deque
- 하카타역
- queue
- 완전 탐색
- 일본 여행
- 미로찾기
- 다이나믹 프로그래밍
- 백준
- 후쿠오카 4박 5일
- 삼성 SW 테스트
- 플로이드
- 삼성테스트
- 플로이드 와샬
- 깊이 우선 탐색
- BFS
- DP
- 삼성시험
- 알고리즘
- IOS
- 후쿠오카 여행경비
- 너비 우선 탐색
- 후쿠오카 요도바시 하카타
- 후쿠오카
- 큐
- dfs
- brute force
Archives
- Today
- Total
맛있는감귤
BOJ : 13913 숨바꼭질4 본문
문제 : 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 < 0) continue; if(visited[nx]!=-1) continue; 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 |