题意 :人追头牛,有两种交通方式一种是步行,步行每次每分钟只能前进一个单位,或者后退一个单位,另一前进到种交通方式是瞬移,瞬移的话每次每分钟只能从当前位置x ,前进到位置2x ,问从n 到k最少用多少时间。
思路:我感觉很是惭愧啊, 这道题我做过的,但是呢 ,我却忘了,我刚开始用的深搜,没写出来,然后又用了最短路,还是没出来,后来我看了看自己以前写的代码,是用的广搜,后来用了广搜写了又wa了两次,因为其中的等号关系,,,,
代码
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<queue>
const int N=200110;
using namespace std;
int n,k,i,j;
int vis[N];
struct node
{
int x,time;
};
void bfs()
{
queue<node>q;
node a;
a.x=n;
a.time=0;
q.push(a);
while(!q.empty())
{
a=q.front();
q.pop();
if(a.x==k)
{
printf("%d\n",a.time);
return ;
}
if(a.x>=1&&vis[a.x-1]==0)
{
node b;
b.x=a.x-1;
vis[a.x-1]=1;
b.time=a.time+1;
q.push(b);
}
if(a.x<=k&&vis[a.x+1]==0)
{ node b;
b.x=a.x+1;
vis[a.x+1]=1;
b.time=a.time+1;
q.push(b);
}
if(a.x<=k&&vis[2*a.x]==0)
{ node b;
b.x=2*a.x;
vis[a.x*2]=1;
b.time=a.time+1;
q.push(b);
}
}
}
int main()
{
while(~scanf("%d%d",&n,&k))
{
memset(vis,0,sizeof(vis));
vis[n]=1;
bfs();
}
return 0;
}