https://www.luogu.org/problem/show?pid=1588
题目描述
FJ丢失了他的一头牛,他决定追回他的牛。已知FJ和牛在一条直线上,初始位置分别为x和y,假定牛在原地不动。FJ的行走方式很特别:他每一次可以前进一步、后退一步或者直接走到2*x的位置。计算他至少需要几步追上他的牛。
输入输出格式
输入格式:
第一行为一个整数t(≤10),表示数据组数;接下来每行包含一个两个正整数x和y(0<x,y≤10^5),分别表示FJ和牛的坐标。
输出格式:
对于每组数据,输出最少步数。
输入输出样例
输入样例#1:
1 5 17
输出样例#1:
4
1 #include <cstring> 2 #include <cstdio> 3 4 inline void read(int &x) 5 { 6 x=0; register char ch=getchar(); 7 for(; ch>'9'||ch<'0'; ) ch=getchar(); 8 for(; ch>='0'&&ch<='9'; ch=getchar()) x=x*10+ch-'0'; 9 } 10 11 const int N(1e5+5); 12 bool vis[N]; 13 struct Queue { 14 int pos,step; 15 }que[N]; 16 17 int AC() 18 { 19 int t,poe,cow; read(t); 20 for(; t--; ) 21 { 22 read(poe),read(cow); 23 if(cow<poe) 24 { 25 printf("%d ",poe-cow); 26 continue; 27 } 28 int tail=0,head=0; 29 memset(que,0,sizeof(que)); 30 memset(vis,0,sizeof(vis)); 31 que[++tail].pos=poe; 32 que[tail].step=0; 33 vis[poe]=1; 34 for(int now,step; head<tail; ) 35 { 36 now=que[++head].pos; 37 step=que[head].step; 38 if(now==cow) 39 { 40 printf("%d ",step); 41 break; 42 } 43 if((now+1)<=N&&!vis[now+1]) 44 { 45 vis[now+1]=1; 46 que[++tail].pos=now+1; 47 que[tail].step=step+1; 48 } 49 if((now-1)>0&&!vis[now-1]) 50 { 51 vis[now-1]=1; 52 que[++tail].pos=now-1; 53 que[tail].step=step+1; 54 } 55 if((now<<1)<=N&&!vis[now<<1]) 56 { 57 vis[now<<1]=1; 58 que[++tail].pos=now<<1; 59 que[tail].step=step+1; 60 } 61 } 62 } 63 return 0; 64 } 65 66 int Aptal=AC(); 67 int main(){;}