题目链接: http://poj.org/problem?id=3278
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 Line 1: Two space-separated integers: N and K Output Line 1: The least amount of time, in minutes, it takes for Farmer John to catch the fugitive cow. Sample Input 5 17 Sample Output 4 Hint The fastest way for Farmer John to reach the fugitive cow is to move along the following path: 5-10-9-18-17, which takes 4 minutes. Source USACO 2007 Open Silver
#include <cstdio> #include <cstring> #include <iostream> #include <cmath> #include<vector> #include<queue> #include<algorithm> using namespace std; typedef long long LL; const int maxn=500009; const int INF=0x3f3f3f3f; const int mod=2009; struct node { int x, step; }; int n, k; int vis[maxn]; int bfs() { memset(vis, 0, sizeof(vis)); queue<node>Q; node p, q; p.x=n; p.step=0; vis[p.x]=1; Q.push(p); while(Q.size()) { q=Q.front(); Q.pop(); if(q.x==k)return q.step; for(int i=0; i<3; i++) { if(i==0) p.x=q.x+1; else if(i==2) p.x=q.x-1; else p.x=q.x*2; if(p.x>=0&&p.x<=100000&&!vis[p.x]) { vis[p.x]=1; p.step=q.step+1; Q.push(p); } } } return -1; } int main() { while(~scanf("%d %d", &n, &k)) { int ans=bfs(); printf("%d ", ans); } return 0; }