USACO 丢失的牛

来源:互联网 发布:mac如何下载eclipse 编辑:程序博客网 时间:2024/06/06 00:13

题目描述

FJ丢失了他的一头牛,他决定追回他的牛。已知FJ和牛在一条直线上,初始位置分别为x和y,假定牛在原地不动。FJ的行走方式很特别:他每一次可以前进一步、后退一步或者直接走到2*x的位置。计算他至少需要几步追上他的牛。

输入输出格式

输入格式:

第一行为一个整数t(≤10),表示数据组数;接下来每行包含一个两个正整数x和y(0

输出格式:

对于每组数据,输出最少步数。

输入输出样例

输入样例#1:

1
5 17

输出样例#1:

4

/**************************    Name:1588 丢失的牛    How to get:luogu.org    By:Shine_Sky**************************//*******************************    这道题一开始就秒用DFS做结果呢--10个TLE    教我做人 哎 只能用BFS了 正好练练BFS有    几周没写BFS了    这道题和BFS模(走迷宫)一样就是把上下左右    四个方向改成+1,-1,*2就好了 上下界判断一下 *******************************/#include<iostream>#include<cstdio>#define f(i,a,b) for(register int i=a;i<=b;i++)#define fd(i,a,b) for(register int i=a;i>=b;i--)using namespace std;inline int read(){    int data=0,w=1; char ch=0;    while(ch!='-' && (ch<'0' || ch>'9')) ch=getchar();    if(ch=='-') w=-1,ch=getchar();    while(ch>='0' && ch<='9') data=data*10+ch-'0',ch=getchar();    return data*w;}inline void write(int x){    if(x<0) putchar('-'),x=-x;    if(x>9) write(x/10);    putchar(x%10+'0');}const int X=1e5,Y=X+7;int t,ans[Y],x,y,q[Y],visit[Y];inline void bfs(int s,int e){//  printf("RE");    int l=1,r=1;    q[l]=s;    ans[s]=0,visit[s]=1;    bool flag=0;    while(r>=l)    {        int nx=q[l++];        if(flag)    break;        f(i,0,2)        {            if(i==0)            {                int dx=nx+nx;                if(dx<=X && dx>0 && !visit[dx])                {                    q[++r]=dx;                    visit[dx]=1;                    ans[dx]=ans[nx]+1;                    if(dx==e)   flag=1;                }            }            else                if(i==1)                {                    int dx=nx+1;                    if(dx<=X && dx>0 && !visit[dx])                    {                        q[++r]=dx;                        visit[dx]=1;                        ans[dx]=ans[nx]+1;                        if(dx==e)   flag=1;                    }                }                else                    if(i==2)                    {                        int dx=nx-1;                        if(dx<=X && dx>0 && !visit[dx])                        {                            q[++r]=dx;                            visit[dx]=1;                            ans[dx]=ans[nx]+1;                            if(dx==e)   flag=1;                        }                    }        }    }    write(ans[e]);    puts("");}int main(){    t=read();    while(t--)    {        x=read(),y=read();        f(i,0,Y-1)            ans[i]=visit[i]=0;        bfs(x,y);    }    return 0;}
原创粉丝点击