1253:抓住那头牛
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 14146 通过数: 5444
【题目描述】
农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0≤N≤100000),牛位于点K(0≤K≤100000)。农夫有两种移动方式:
1、从X移动到X−1或X+1,每次移动花费一分钟
2、从X移动到2×X,每次移动花费一分钟
假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?
【输入】
两个整数,N和K。
【输出】
一个整数,农夫抓到牛所要花费的最小分钟数。
【输入样例】
5 17
【输出样例】
4
【分析】
位置的移动可以有三种可能,1)x=x+1;2)x=x-1;3)x=2*x,广搜这三种可能即可。
【参考代码】
#include <iostream>
#include <queue>
using namespace std;
const int N=100010;
struct node
{
int x; //位置
int steps; //到达x所需步数
};
int n,k; //农夫起点n,牛位置点k
int vis[N]; //访问数组
void bfs()
{
queue <node> q; //申请队列
node s;
s.x=n;
s.steps=0;
q.push(s); //起点入队
vis[n]=1;
while(!q.empty())
{
node t;
t=q.front();
if(t.x==k)
{
cout << t.steps << endl;
return;
}
else
{
node tmp;
if(t.x-1>=0 && !vis[t.x-1])
{
tmp.x=t.x-1;
tmp.steps=t.steps+1;
q.push(tmp);
vis[tmp.x]=1;
}
if(t.x+1<=N && !vis[t.x+1])
{
tmp.x=t.x+1;
tmp.steps=t.steps+1;
q.push(tmp);
vis[tmp.x]=1;
}
if(t.x*2<=N && !vis[t.x*2])
{
tmp.x=t.x*2;
tmp.steps=t.steps+1;
q.push(tmp);
vis[tmp.x]=1;
}
}
q.pop();
}
}
int main()
{
cin >> n >> k;
bfs();
return 0;
}