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
|
#include <queue> #include <cstring> using namespace std; const int maxn = 100005; bool vis[maxn]; int dir[2] = {1, -1}; int n, k; struct { int x, step; }; bool check(node m) { if(m.x < 0 || m.x > 100000 || vis[m.x]) return false; return true; } int bfs(node start) { queue <node> q; q.push(start); node cur; node next; while(q.size()) { cur = q.front(); q.pop(); for(int i = 0; i < 2; i++) { next.x = cur.x + dir[i]; next.step = cur.step + 1; if(check(next)) { q.push(next); vis[next.x] = true; if(next.x == k) return next.step; } } next.x = cur.x * 2; next.step = cur.step + 1; if(check(next)) { q.push(next); vis[next.x] = true; if(next.x == k) return next.step; } } return -1; } int main() { while(cin >> n >> k) { memset(vis, false, sizeof vis); node m; m.x = n; m.step = 0; if(n >= k) cout << n - k << endl; else cout << bfs(m) << endl; } return 0; }
|
近期评论