题目大意:给人和牛的位置(一维,0~100000)牛不动,人动
人有三种动的方法
1,左移一个单位
2,右移一个单位
3,到当前位置的两倍处
每种方法耗时一分钟,求抓到牛的时间
解题思路:开一个访问数组,用bfs,未访问则入队列
注意事项:注意判断是否出界
标记已访问时应在出队列时
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
struct node
{
int x;
int t;
};
int main()
{
int n,k;
while(cin>>n>>k)
{
queue <node> fj;
while(!fj.empty())
fj.pop();
node q,p;
q.x=n;
q.t=0;
int vist[100005]={0};
vist[n]=1;
fj.push(q);
while(q.x!=k)
{
if(q.x-1>=0&&q.x-1<=100000&&!vist[q.x-1])
{
p.x=q.x-1;
p.t=q.t+1;
fj.push(p);
// vist[q.x-1]=1;
}
if(q.x+1>=0&&q.x+1<=100000&&!vist[q.x+1])
{
p.x=q.x+1;
p.t=q.t+1;
fj.push(p);
// vist[q.x+1]=1;
}
if(q.x*2>=0&&q.x*2<=100000&&!vist[q.x*2])
{
p.x=q.x*2;
//cout<<p.x<<' '<<endl;;
p.t=q.t+1;
fj.push(p);
// vist[2*q.x]=1;
}
fj.pop();
// cout<<q.x<<' '<<q.t<<endl;
vist[q.x]=1;
q=fj.front();
}
cout<<q.t<<endl;
}
return 0;
}