Problem Description
Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Farmer John has two modes of transportation: walking and teleporting. * Walking: FJ can move from any point X to the points X - 1 or X + 1 in a single minute * Teleporting: FJ can move from any point X to the point 2 × X in a single minute. If the cow, unaware of its pursuit, does not move at all, how long does it take for Farmer John to retrieve it?
Input
Line 1: Two space-separated integers: N and K
Output
Line 1: The least amount of time, in minutes, it takes for Farmer John to catch the fugitive cow.
Example Input
5 17
Example Output
4
解题思路
两种交通方式,三种走法,即点可能存在的三种邻接点。
后记,代码1是最初最这个题的代码,2018/5/14再来补个代码,见代码2
代码1
#include<stdio.h>
#include<cstring>
#include<queue>
using namespace std;
typedef struct Node{
int num,step;
}Node;
int visited[100001],k;
int Check(int t)//检查结点的合法性
{
if(t<0||t>100000||visited[t]==1)
/*注意点:if(visited[t]==1||t<0||t>100000)这种情况就报错,
如果t<0||t>100000,visited[t]就存在越界错误*/
return 0;
return 1;
}
void BFS(int n)
{
queue<Node>q;
Node fir;
fir.num=n;
fir.step=0;
visited[n]=1;
q.push(fir);
while(!q.empty())
{
Node tmp,nxt;
tmp=q.front();
// printf("num=%d\n",tmp.num);
q.pop();
if(tmp.num==k)
{
printf("%d\n",tmp.step);
return;
}
nxt.num=tmp.num+1;
if(Check(nxt.num))
{
nxt.step=tmp.step+1;
visited[nxt.num]=1;
q.push(nxt);
}
nxt.num=tmp.num-1;
if(Check(nxt.num))
{
nxt.step=tmp.step+1;
visited[nxt.num]=1;
q.push(nxt);
}
nxt.num=tmp.num*2;
if(Check(nxt.num))
{
nxt.step=tmp.step+1;
visited[nxt.num]=1;
q.push(nxt);
}
}
}
int main()
{
int n;
scanf("%d%d",&n,&k);
memset(visited,0,sizeof(visited));
BFS(n);
return 0;
}
代码2
#include<iostream>
#include<cstdio>
#include<string>
#include<string.h>
#include<queue>
using namespace std;
const int maxn=1e5+1;
typedef struct Node{
int x,step;
}Node;
int vis[maxn];
int bfs(int s,int t)
{
if(s==t)
return 0;
memset(vis,0,sizeof(vis));
queue<Node> q;
Node tmp,nxt;
tmp.x=s;
tmp.step=0;
q.push(tmp);
vis[s]=1;
while(!q.empty()){
tmp=q.front();
nxt.step=tmp.step+1;
q.pop();
for(int i=0;i<3;i++)
{
if(i==0)
nxt.x=tmp.x-1;
else if(i==1)
nxt.x=tmp.x+1;
else
nxt.x=tmp.x*2;
if(nxt.x<0||nxt.x>=maxn)
continue;
if(!vis[nxt.x]){
if(nxt.x==t)
return nxt.step;
vis[nxt.x]=1;
q.push(nxt);
}
}
}
return 0;
}
int main()
{
int n,k;
scanf("%d%d",&n,&k);
printf("%d\n",bfs(n,k));
return 0;
}