手动实现BFS

STL 作为C++自带的模板,成为广大Oier的神器

今天,就用手动方式实现BFS

题目描述

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

输入格式

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

输出格式

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

输入样例

1
2
1 
5 17

输出样例

1
4

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <cstdio>
#include <cstring>
using namespace std;
int T;
int Q[100001],step[100001];
bool visit[100001];
int x,y;
void work(){
memset(visit,false,sizeof(visit));
memset(Q,0,sizeof(Q));
memset(step,0,sizeof(step));
if(x>=y){
printf("%d\n",x-y);
return;
}
int head=0,tail=1;
Q[1]=x;step[1]=0;visit[1]=true;
int tmp;
while(head<tail){
head++;
tmp=Q[head]-1;
if(!visit[tmp]&&tmp>=0){
tail++;
Q[tail]=tmp;
step[tail]=step[head]+1;
visit[tmp]=true;
if(tmp==y){
printf("%d\n",step[tail]);
return;
}
}
tmp=Q[head]+1;
if(!visit[tmp]&&tmp<100005){
tail++;
Q[tail]=tmp;
step[tail]=step[head]+1;
visit[tmp]=true;
if(tmp==y){
printf("%d\n",step[tail]);
return;
}
}
if((Q[head]*2<=100000)&&(Q[head]*2>0)&&(!visit[Q[head]*2])){
tmp=Q[head]*2;
tail++;
Q[tail]=tmp;
step[tail]=step[head]+1;
visit[tmp]=true;
if(tmp==y){
printf("%d\n",step[tail]);
return;
}
}
}
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d%d",&x,&y);
work();
}
return 0;
}