洛谷 P1588 丢失的牛

题目描述

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

输入输出格式

输入格式:

 

第一行为一个整数t(≤10),表示数据组数;接下来每行包含一个两个正整数x和y(0<x,y≤10^5),分别表示FJ和牛的坐标。

 

输出格式:

 

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

 

输入输出样例

输入样例#1: 复制
1 
5 17
输出样例#1: 复制
4
思路:宽搜一下就可以。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int t,x,y;
int ans=0x7f7f7f7f;
void dfs(int pos,int tot){
    if(tot>ans)    return ;
    if(pos==y){
        ans=min(tot,ans);
        return ;
    }
    dfs(pos+1,tot+1);
    dfs(pos-1,tot+1);
    dfs(pos*2,tot+1);
}
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&x,&y);
        dfs(x,0);
        cout<<ans<<endl;
    }
}
TLE的dfs
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int t,x,y;
int vis[500000];
struct nond{
    int pos,step;
};
queue<nond>que;
void bfs(int x){
    while(!que.empty())    que.pop();
    nond tmp;tmp.pos=x;tmp.step=0;
    vis[x]=1;que.push(tmp);
    while(!que.empty()){
        nond now=que.front();
        que.pop();
        nond a,b,c;
        c.pos=now.pos+1;c.step=now.step+1;if(c.pos<200000&&!vis[c.pos])    que.push(c),vis[c.pos]=1;
        if(c.pos==y){ cout<<c.step<<endl;break; }
        a.pos=now.pos-1;a.step=now.step+1;if(a.pos<200000&&!vis[a.pos])    que.push(a),vis[a.pos]=1;
        if(a.pos==y){ cout<<a.step<<endl;break; }
        b.pos=now.pos*2;b.step=now.step+1;if(b.pos<200000&&!vis[b.pos])    que.push(b),vis[b.pos]=1;
        if(b.pos==y){ cout<<b.step<<endl;break; }
    }
}
int main(){
    scanf("%d",&t);
    while(t--){
        memset(vis,0,sizeof(vis));
        scanf("%d%d",&x,&y);
        bfs(x);
    }
}

 

 
posted @ 2018-01-06 11:06  一蓑烟雨任生平  阅读(202)  评论(0编辑  收藏  举报