Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 48020 | Accepted: 15054 |
Description
Farmer John has been informed of the location of a fugitive(逃亡的;难以捉摸的;短暂的) cow and wants to catch her immediately. He starts at a pointN (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 orX+ 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
题意:在一维坐标系中,给定John的位置,还有cow的位置,john有2种行动方式,(一)向前走一步(-1),想后走一步(+1);(二)跳到当前位置的2倍位置。
问:最少需要多少时间(分钟)可以抓到cow。
】】用vis数组优化。【【
【bfs搜索即可】:
#include<stdio.h>
#include<string.h>
#include<queue>
int x[4]={-1, 1, 2};
int visit[200000+10]={0};
struct node{
int ans;//记录最短步数
int x;//存坐标
}que[200000+10], t, f;
void BFS(int nn, int kk)
{
memset(que, 0, sizeof(que));
memset(visit, 0, sizeof(visit));
int s=0, e=0;//s为入队列的下表,e为出队列的下表。
que[s++].x = nn;
visit[nn] = 1;
t.ans = 0;//初始化刚开始的到K的步数为0;
while(s>e)
{
t = que[e++];
for(int i=0; i<3; i++)
{
if(i!=2)
f.x = t.x + x[i];
else
f.x = t.x * x[i];
f.ans = t.ans + 1;
if(f.x == kk)
{
printf("%d\n", f.ans);
return;
}
if(f.x != kk && visit[f.x]==0 && (f.x>0 && f.x<100000) )
{
que[s++] = f;
visit[f.x] = 1;
}
}
}
}
int main()
{
int n, k;
while(~scanf("%d%d", &n, &k))
{
if(n>=k){
printf("%d\n", n-k);
continue;
}
else
BFS(n, k);
}
return 0;
}
上次写的代码有点乱,再整理一下,RE了好几遍,BFS里的if语句,需要加f.x>0 && f.x<100000。