알고리즘/BAEKJOON
백준 13700번 완전 범죄
pureworld
2019. 3. 26. 18:51
백준 13700번 완전 범죄
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 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | #include <iostream> #include <string> #include<queue> #include <vector> #include <algorithm> using namespace std; const int MAX = 100001; int N, S, D, F, B, K; int locate[MAX]; int visited[MAX]; int ArriveHome(int NowLocate, int Count) { queue<pair<int,int> > q; q.push(make_pair(NowLocate,0 )); while (!q.empty()) { int l = q.front().first; int cnt = q.front().second; q.pop(); if (visited[l]) continue; if (l<1 || l>N) continue; visited[l]++; if (locate[l] == 1) continue; if (l == D) return cnt; for (int i = 0; i < 2; i++) { if (i == 0) { q.push(make_pair(l + F, cnt + 1)); } else q.push(make_pair(l - B,cnt+1)); } } return -1; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> N >> S >> D >> F >> B >> K; for (int i = 0; i < K; i++) { int a; cin >> a; locate[a] = 1; } int ret = ArriveHome(S, 0); if (ret == -1) cout << "BUG FOUND"; else cout << ret; return 0; } | cs |
출처:https://www.acmicpc.net/problem/13700
처음엔 DFS로 접근을 했었는데 실패했습니다...
앞으로 F보 전진,뒤로 B보 후진 할때
예시 2번째 케이스는 경찰서의 위치때문에 1->3->2->4->3->2->4 이런식으로 무한 루프가 돌게 되네요.
이 루프를 해결하기위해서 visitied[i]를 사용해서 이미 방문한위치는 다시 방문하지 않도록 기록을 해주면 루프를 돌지않고
while문을 벗어나게 됩니다. D에 도착하지 못하는경우이므로 return값이 -1인 경우에는
BUG FOUND 처리를 해주면 됩니다!