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 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | #include <stdio.h> #include <queue> #include <utility> using namespace std; int a, b, n, m; int bfs(int cur) { queue<pair<int, int>> q; q.push(make_pair(cur, 0)); int dx[2] = { 1,-1 }; int dxA[2] = { a,-a }; int dxB[2] = { b,-b }; int mulAB[2] = { a, b }; int chk[100001] = { 0 }; chk[cur] = 1; int rst = -1; while (!q.empty()) { cur = q.front().first; int cnt = q.front().second; if (cur == m) { return cnt; break; } q.pop(); // cur+-1 for (int i = 0; i < 2; i++) { int next = cur + dx[i]; if (next < 0 || next>100000) continue; if (chk[next] != 0) continue; chk[next] = 1; q.push(make_pair(next, cnt + 1)); } //cur+-a for (int i = 0; i < 2; i++) { int next1 = cur + dxA[i]; if (next1 < 0 || next1>100000) continue; if (chk[next1] != 0) continue; chk[next1] = 1; q.push(make_pair(next1, cnt + 1)); } //cur-+b for (int i = 0; i < 2; i++) { int next2 = cur + dxB[i]; if (next2 < 0 || next2>100000) continue; if (chk[next2] != 0) continue; chk[next2] = 1; q.push(make_pair(next2, cnt + 1)); } //cur*ab for (int i = 0; i < 2; i++) { int next = cur * mulAB[i]; if (next < 0 || next>100000) continue; if (chk[next] != 0) continue; chk[next] = 1; q.push(make_pair(next, cnt + 1)); } } return rst; } int main() { scanf("%d %d %d %d", &a, &b, &n, &m); int rst = bfs(n); printf("%d", rst); } | cs |
꼼수 부리다가 계속 에러가 났다
꼼수는 좋으나, 논리적인 부분에서 오류가 안 나도록 제발 조심하자
몇분을 날린거야..진짜..
'알고리즘 > BFS' 카테고리의 다른 글
3184 양 (0) | 2020.01.20 |
---|---|
2251 물통 (0) | 2020.01.20 |
9372 상근이의 여행 (0) | 2020.01.20 |
5014 스타트링크 (0) | 2020.01.20 |
2589 보물섬 (0) | 2020.01.19 |