在学习搜索时写出来的第一道题,其中不会计算追赶时所走的步数,最后看了非常好的代码才明白。
农夫约翰已经被告知一头逃逸的奶牛的位置,并希望立即抓住她。他从数字行上的点 N (0 ≤ N ≤ 100,000) 开始,而牛在同一数字行上从点 K (0 ≤ K ≤ 100,000) 开始。农民约翰有两种交通方式:步行和传送。
步行:约翰 可以在一分钟内从任何点 X移动到点X - 1 或
X + 1 ,传送:约翰 可以在一分钟内从任何点 X移动到点 2 × X。
如果牛不知道约翰的追赶,不移动,多久农民约翰要找回它?
#include <iostream>
#include <queue>
#include<cstring>
using namespace std;
int arr[200000]={
0};//定义大点的数组防止超限
void bfs(int a,int b)
{
if(a==b)
{
cout<<0<<endl;//位置相同时为0
}
else {
queue<int>s;
s.push(a);
arr[a]++;//区分已经放入队列的
int i,k,x[3],m[200000]={
0},n;//计算步数
while(!s.empty())
{
k=s.front();
s.pop();
if(k<b)
{
x[0]=k+1;//三种情况
x[1]=k-1;
x[2]=k*2;
}
else if(k>b)
{
for(i=0;i<3;i++)
{
x[i]=k-1;
}
}
for(i=0;i<3;i++)
{
if(x[i]==b)
{
n=k;
while(!s.empty())//清空队列
{
s.pop();
}
break;
}
else if((x[i]>b||x[i]<b)&&arr[x[i]]==0)
{
s.push(x[i]);
m[x[i]]=m[k]+1;//计算步数
arr[x[i]]++;//区分并放入队列
}
}
}
cout<<m[n]+1<<endl;}
}
int main()
{
int a,b;
cin>>a>>b;
bfs(a,b);
}