描述
农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000)。农夫有两种移动方式:
1、从X移动到X-1或X+1,每次移动花费一分钟
2、从X移动到2*X,每次移动花费一分钟
假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?
输入
两个整数,N和K
输出
一个整数,农夫抓到牛所要花费的最小分钟数
样例输入
5 17
样例输出
4
分析
1.深搜
想求最优(短)解,则要遍历所有走法。可以用
各种手段优化,比如,若已经找到路径长度为n
的解,则所有长度大于n的走法就不必尝试。
运算过程中需要存储路径上的节点,数量较少。
用栈存节点
2.广搜
可确保找到最优解,但是因扩展出
来的节点较多,且多数节点都需要
保存,因此需要的存储空间较大。
用队列存节点。
代码
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map>
using namespace std;
int n,k;
struct Node
{
int x,step;
Node(int xx,int ss)
{
x=xx;step=ss;
}
};
queue<Node>q;
bool tag[200005];
int main()
{
cin>>n>>k;
q.push(Node(n,0));
memset(tag,0,sizeof(tag));
tag[n]=true;
while(!q.empty())
{
Node tmp=q.front();
int x=tmp.x,s=tmp.step;
q.pop();
if(x==k)
{
cout<<s<<endl;
break;
}
if(x+1<=k&&!tag[x+1])
{
tag[x+1]=true;
q.push(Node(x+1,s+1));
}
if(x<k&&!tag[2*x])
{
tag[2*x]=true;
q.push(Node(2*x,s+1));
}
if(x-1>=0&&!tag[x-1])
{
tag[x-1]=true;
q.push(Node(x-1,s+1));
}
}
return 0;
}