Catch That Cow
Time Limit: 2000MS Memory Limit: 65536KB
Submit Statistic Discuss
Problem 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.
Example Input
5 17
Example Output
4
Hint
poj3278 有链接提示的题目请先去链接处提交程序,AC后提交到SDUTOJ中,以便查询存档。
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.
Author
think:
广度优先搜索,结构体加数组。
这道题目我先在oj上提交,ac之后,然后去poj提交,结构居然MLE,超内存,然后我改成了十万的,再提交,WA,瞬间,我就很懵,oj后台的数据真的很少,到了poj就不可行了,然后改完之后ac了………
oj上ac的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node
{
int data;
int ans;
}que[12121212], p, q;
int v[1212111];
int n, m;
void bfs(int n, int m)
{
int front = 0, rear = 0;
p.data = n;
p.ans = 0;
que[rear++] = p;
v[p.data] = 1;
while(front<rear)
{
q = que[front++];
if(q.data==m)
{
printf("%d\n", q.ans);
return ;
}
if(q.data-1>=0&&v[q.data-1]==0)
{
p.data = q.data-1;
p.ans = q.ans+1;
que[rear++] = p;
v[p.data] = 1;
}
if(q.data+1<=m&&v[q.data+1]==0)
{
p.data = q.data+1;
p.ans = q.ans+1;
que[rear++] = p;
v[p.data] = 1;
}
if(q.data*2<=m&&v[q.data*2]==0)
{
p.data = q.data*2;
p.ans = q.ans+1;
que[rear++] = p;
v[p.data] = 1;
}
}
printf("-1\n");
}
int main()
{
while(~scanf("%d %d", &n, &m))
{
memset(v, 0, sizeof(v));
memset(que, 0, sizeof(que));
bfs(n, m);
}
return 0;
}
poj:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node
{
int data;
int ans;
}que[111212], p, q;
int v[121111];//十万的数据量,不要开太大
int n, m;
void bfs(int n, int m)
{
int front = 0, rear = 0;
p.data = n;
p.ans = 0;
que[rear++] = p;
v[p.data] = 1;
while(front<rear)
{
q = que[front++];
if(q.data==m)
{
printf("%d\n", q.ans);
return ;
}
if(q.data-1>=0&&q.data-1<=100000&&v[q.data-1]==0)//农民走的点可以是在奶牛之后,只要不超过100000就可以了×××
{
p.data = q.data-1;
p.ans = q.ans+1;
que[rear++] = p;
v[p.data] = 1;
}
if(q.data+1<=100000&&q.data+1>=0&&v[q.data+1]==0)//农民走的点可以是在奶牛之后,只要不超过100000就可以了×××
{
p.data = q.data+1;
p.ans = q.ans+1;
que[rear++] = p;
v[p.data] = 1;
}
if(q.data*2<=100000&&q.data*2>=0&&v[q.data*2]==0)//农民走的点可以是在奶牛之后,只要不超过100000就可以了×××
{
p.data = q.data*2;
p.ans = q.ans+1;
que[rear++] = p;
v[p.data] = 1;
}
}
printf("0\n");
}
int main()
{
while(~scanf("%d %d", &n, &m))
{
memset(v, 0, sizeof(v));
memset(que, 0, sizeof(que));
bfs(n, m);
}
return 0;
}
本文详细解析了CatchThatCow问题的算法实现,采用广度优先搜索策略,通过具体实例展示了如何快速找到静止不动的逃逸奶牛。文章对比了不同在线评测平台提交的代码差异及原因。
5072

被折叠的 条评论
为什么被折叠?



