Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 68324 | Accepted: 21515 |
Description
Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Farmer John has two modes of transportation: walking and teleporting.
* Walking: FJ can move from any point X to the points X - 1 or X + 1 in a single minute
* Teleporting: FJ can move from any point X to the point 2 × X in a single minute.
If the cow, unaware of its pursuit, does not move at all, how long does it take for Farmer John to retrieve it?
Input
Output
Sample Input
5 17
Sample Output
4
Hint
Source
搜索变化数的时候,注意不要让数字越界(无论是越最大值还是越到-1)
代码如下:
#include <cstdio> #include <cstring> #include <queue> #include <algorithm> #define MAX 200222 using namespace std; int n,k; int map[MAX]; struct node { int num,stp; }a,b; int bfs() { queue<node>q; a.num = n; a.stp = 0; map[n] = 1; q.push(a); while (1) { a = q.front(); q.pop(); for (int i = 0;i < 3;i++) { if (i == 0) { b.num = a.num+1; if (b.num == k) return a.stp+1; if (b.num < MAX-200 && map[b.num] == 0) { b.stp = a.stp+1; map[b.num] = 1; q.push(b); } } else if (i == 1) { b.num = a.num-1; if (b.num == k) return b.stp; if (b.num < MAX-200 && b.num>=0 && map[b.num] == 0) //这里要注意不要让num为-1 { b.stp = a.stp+1; map[b.num] = 1; q.push(b); } } else { b.num = a.num*2; if (b.num == k) return b.stp; if (b.num < MAX-200 && map[b.num] == 0) { b.stp = a.stp+1; map[b.num] = 1; q.push(b); } } } } } int main() { int ans; while (~scanf ("%d %d",&n,&k)) { memset (map,0,sizeof(map)); if (n >= k) printf ("%d\n",n-k); else { ans = bfs(); printf ("%d\n",ans); } } return 0; }