题意:输入n,m,求由n到m需要最少步数,n只能加一减一或者乘二。每一种可能读入队尾,然后再从队首一个一个的遍历
(0 ≤ n,m≤ 100,000) ,Max 需要取到2*100,000
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int Max = 2e5;
int vis[Max],dis[Max];
int bfs(int s,int e)
{
int t;
memset(vis,0,sizeof(vis));
queue<int> q;
vis[s]=1;dis[s]=0;q.push(s);
while(!q.empty())
{
t = q.front();q.pop();
if(t==e) return dis[t];
if((t-1)>=0&&(t-1)<Max&&!vis[t-1])
{
dis[t-1]=dis[t]+1;
vis[t-1]=1;
q.push(t-1);
}
if((t+1)>=0&&(t+1)<Max&&!vis[t+1]){
dis[t+1]=dis[t]+1;
vis[t+1]=1;
q.push(t+1);
}
if((t*2)>=0&&(t*2)<Max&&!vis[t*2]){
dis[t*2]=dis[t]+1;
vis[t*2]=1;
q.push(t*2);
}
}
}
int main()
{
int n,m;
while(cin>>n>>m)
{
cout<<bfs(n,m)<<endl;
}
return 0;
}