Catch That Cow

来源:互联网 发布:无线传感器网络三要素 编辑:程序博客网 时间:2024/06/05 03:34

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;}
原创粉丝点击