题目描述
FJ丢失了他的一头牛,他决定追回他的牛。已知FJ和牛在一条直线上,初始位置分别为x和y,假定牛在原地不动。FJ的行走方式很特别:他每一次可以前进一步、后退一步或者直接走到2*x的位置。计算他至少需要几步追上他的牛。
输入输出格式
输入格式:
第一行为一个整数t(≤10),表示数据组数;接下来每行包含一个两个正整数x和y(0<x,y≤10^5),分别表示FJ和牛的坐标。
输出格式:
对于每组数据,输出最少步数。
输入输出样例
输入样例#1
1 5 17
输出样例#1
4
思路
不同其他bfs的题是,这题只有3种方案可以走,一个是向左移一步,一个是向右移一步,一个是乘2。
这题让我更加分清了dfs和bfs的区别。dfs是不撞南山不回头的,不能保证步数最少,所以用bfs最合适,并且bfs的搜索方法是一层一层向外拓展节点,而本题就是这样,把每一种可行的方法逐一尝试一遍(在同一层节点)。
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
int que[100001][4],n,k,x;
bool b[100001];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int i,j,t;
cin>>t;
while(t--)
{
memset(que,0,sizeof(que));
memset(b,0,sizeof(b));
cin>>n>>k;
que[1][1]=n;
b[n]=1;
int head(1),tail(2);
while(head<tail)
{
for(i=1;i<=3;i++)
{
x=que[head][1];
if(i==1)
{
x++;
}
if(i==2)
{
x--;
}
if(i==3)
{
x=x*2;
}
if(x>=1 && x<=100000)
{
if(b[x]==0)// || que[x][2]>que[que[head][1]][2]+1)
{
que[tail][1]=x;
b[x]=1;
que[x][2]=que[que[head][1]][2]+1;
tail++;
}
}
}
head++;
}
cout<<que[k][2]<<endl;
}
return 0;
}