一开始就用我习惯的queue的方法进行广搜,结果就后面重复的枝条太多了。
后来用状态记录就OK
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<vector>
#include<sstream>
#include<algorithm>
#include<queue>
using namespace std;
struct my
{
int num,t;
};
int ans;
int s,e;
my go[300000];
bool vist[300000];
void bfs()
{
memset(vist,false,sizeof(vist));
int head,tail;
head=tail=0;
vist[s]=true;
go[head].num=s;
go[head].t=0;
my cur;
while (head<=tail)
{
my d=go[head++];
if (d.num==e)
{
ans=d.t;
return;
}
if (d.num-1>=0 && !vist[d.num-1])
{
tail++;
go[tail].num=d.num-1;
go[tail].t=d.t+1;
vist[d.num-1]=true;
}
if (d.num<=e && !vist[d.num+1])
{
tail++;
go[tail].num=d.num+1;
go[tail].t=d.t+1;
vist[d.num+1]=true;
}
if (d.num<=e && !vist[d.num*2] && d.num)
{
tail++;
go[tail].num=d.num*2;
go[tail].t=d.t+1;
vist[d.num*2]=true;
}
}
}
int main()
{
int i,j,k;
while (cin>>s>>e)
{
bfs();
cout<<ans<<endl;
}
return 0;
}
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 34076 | Accepted: 10496 |
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