题目描述
FJ丢失了他的一头牛,他决定追回他的牛。已知FJ和牛在一条直线上,初始位置分别为x和y,假定牛在原地不动。FJ的行走方式很特别:他每一次可以前进一步、后退一步或者直接走到2*x的位置。计算他至少需要几步追上他的牛。
输入输出格式
输入格式:
第一行为一个整数t(≤10),表示数据组数;接下来每行包含一个两个正整数x和y(0<x,y≤10^5),分别表示FJ和牛的坐标。
输出格式:
对于每组数据,输出最少步数。
输入输出样例
输入样例#1: 复制
1
5 17
输出样例#1: 复制
TLE的dfs
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; } }
#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(a.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); } }