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.
wa了两次,开始把数据域控制在0-200000之间,结果超时了,仔细考虑一下会发现,其实不会到200000,控制在0-100100就可以了
#include"iostream" #include<queue> #include"string.h" using namespace std; int n,k; bool sign[200007]; struct node{ int x,step; }; bool check(int a) { if(!sign[a]&&a>=0&&a<110000) return true; return false; } void bfs() { node mm,nn; mm.x=n; mm.step=0; queue<node> jj; jj.push(mm); sign[n]=true; while(!jj.empty()) { nn=jj.front(); jj.pop(); if(nn.x==k) { cout<<nn.step<<endl; return; } mm=nn; mm.x++; mm.step++; if(check(mm.x)) { sign[mm.x]=true; jj.push(mm); } mm=nn; mm.x--; mm.step++; if(check(mm.x)) { sign[mm.x]=true; jj.push(mm); } mm=nn; mm.x=2*mm.x; mm.step++; if(check(mm.x)) { sign[mm.x]=true; jj.push(mm); } } } int main() { cin>>n>>k; memset(sign,0,sizeof(sign)); bfs(); return 0; }