题意:在一维坐标轴上给你起点和终点的坐标,你可以向前走一步、向后走一步、移动到当前坐标*2的点 ,问你最少能用几步到达终点
思路:其实我一开始想用dfs的,后来做不出来,看到网上的blog都是用bfs,唉。。。。
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int m,k;
int vis[200000];
struct node{
int x;
int step;
}q,temp;
int bfs()
{
int i;
memset(vis,0,sizeof(vis));
queue<node>que;
que.push(q);
vis[q.x]=1;
while(!que.empty())
{
q=que.front();
que.pop();
if(q.x==k) return q.step;
temp=q;
temp.x=q.x+1;
if(temp.x>=0&&temp.x<=100000&&vis[temp.x]==0)
{
temp.step=q.step+1;
vis[temp.x]=1;
que.push(temp);
}
temp.x=q.x-1;
if(temp.x>=0&&temp.x<=100000&&vis[temp.x]==0)
{
temp.step=q.step+1;
vis[temp.x]=1;
que.push(temp);
}
temp.x=q.x*2;
if(temp.x>=0&&temp.x<=100000&&vis[temp.x]==0)
{
temp.step=q.step+1;
vis[temp.x]=1;
que.push(temp);
}
}
}
int main()
{
while(scanf("%d%d",&m,&k)!=EOF)
{
q.x=m;
q.step=0;
cout<<bfs()<<endl;
}
return 0;
}