3种移动方式,+1,-1,*2,在入队前需要剪枝,即限制条件,我在这个边界条件卡了两个小时,一直WA和RE,真是代码5分钟,调试2小时啊。。。我把边界上限设置为目标地点,但这样完全是错的。。。
例如 输入6 10,很明显,最短的时间是6->12->11->10,如果超过就剪掉那么结果就。。。唉我这猪脑子
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<iostream>
using namespace std;
int n,m;
int vis[100005];
struct node{
int step;
int dir;//当前位置
};
int ans;
node Now,Next;
queue<node>q;
void bfs(int x){
Now.dir=x;Now.step=0;
q.push(Now);
while(!q.empty()){
Now=q.front();q.pop();
if(Now.dir==m){
ans=Now.step;
return;
}
// int pos=0;
for(int i=0;i<3;i++){
if(i==0)Next.dir=Now.dir-1;
else if(i==1)Next.dir=Now.dir+1;
else Next.dir=Now.dir*2;
if(Next.dir<0||Next.dir>100005)continue;//我在这里被卡了两个小时,我判断边界上限设置为目标地点。。。
if(!vis[Next.dir]){
vis[Next.dir]=1;
Next.step=Now.step+1;
//Next.dir=pos;
q.push(Next);
}
}
}
}
int main()
{
//while(cin>>n>>m){
cin>>n>>m;
//memset(vis,0,sizeof(vis));
while(!q.empty())q.pop();
if(n>=m){
cout<<n-m<<endl;
}
else{
bfs(n);
cout<<ans<<endl;
}
//}
return 0;
}