题目描述
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#include #include #include 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< <
#include#include #include #include #include using namespace std;int t,x,y;int vis[500000];struct nond{ int pos,step;};queue 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< <