描述
农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000)。农夫有两种移动方式:
1、从X移动到X-1或X+1,每次移动花费一分钟
2、从X移动到2*X,每次移动花费一分钟
假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?
输入
两个整数,N和K
输出
一个整数,农夫抓到牛所要花费的最小分钟数
样例输入
5 17
样例输出
4
代码:
(一)(无函数):
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100000 + 10;
int q[MAXN][2], front, rear;
bool vis[MAXN];
int n, k;
int main()
{
cin >> n >> k;
if(n == k)
{
cout << 0 << endl;
return 0;
}
front = rear = 1;
q[1][0] = n; q[1][1] = 0; vis[n] = true;
while(front <= rear)
{
int x = q[front][0];
for(int i = 1; i <= 3; i++)
{
int nx;
if(i == 1) nx = x - 1;
if(i == 2) nx = x + 1;
if(i == 3) nx = x * 2;
if(nx >= 0 && nx <= 100000 && !vis[nx])
{
rear++;
q[rear][0] = nx; q[rear][1] = q[front][1] + 1;
vis[nx] = true;
}
if(nx == k)
{
cout << q[rear][1] << endl;
return 0;
}
}
front++;
}
return 0;
}
(二)(结构体+宽搜):
#include <bits/stdc++.h>
using namespace std;
struct node
{
int num,time;
}tmp,q[100010];
bool b[100010];
int m,n;
int front,rear;
void bfs();
int main()
{
cin>>m>>n;
if(m==n){cout<<0;return 0;}
bfs();
return 0;
}
void bfs()
{
front=0;rear=1;
q[1].num=m;
q[1].time=0;
b[m]=true;
while(front<rear)
{
front++;
int x=q[front].num;
for(int i=1;i<=3;i++)
{
if(i==1)if(!b[x-1]&&x-1>=0) tmp.num=x-1;
if(i==2)if(!b[x+1]&&x+1<=100000) tmp.num=x+1;
if(i==3)if(!b[2*x]&&2*x<=100000) tmp.num=2*x;
tmp.time=q[front].time+1;
if(!b[tmp.num])q[++rear]=tmp;
b[tmp.num]=1;
if(tmp.num==n){cout<<tmp.time;return;}
}
}
}
(三)(结构体+队列):
#include <bits/stdc++.h>
using namespace std;
struct node
{
int num,time;
}tmp;
queue<node>q;
bool b[200010];
int m,n;
int main()
{
cin>>m>>n;
if(m==n)
{
cout<<0;
return 0;
}
tmp.num=m;
tmp.time=0;
q.push(tmp);
b[m]=true;
while(!q.empty())
{
int x=q.front().num;
for(int i=1;i<=3;i++)
{
if(i==1)if(!b[x-1]&&x-1>=0) tmp.num=x-1;
if(i==2)if(!b[x+1]&&x+1<=100000) tmp.num=x+1;
if(i==3)if(!b[2*x]&&2*x<=100000) tmp.num=2*x;
tmp.time=q.front().time+1;
if(!b[tmp.num]) q.push(tmp);
b[tmp.num]=1;
if(tmp.num==n)
{
cout<<tmp.time;
return 0;
}
}
q.pop();
}
return 0;
}