Catch That Cow

本文详细解析了CatchThatCow问题的算法实现,采用广度优先搜索策略,通过具体实例展示了如何快速找到静止不动的逃逸奶牛。文章对比了不同在线评测平台提交的代码差异及原因。

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值