#include<cstdio>
#include<queue>
#include<string.h>
using namespace std;
typedef struct name
{
int x;
int time;
}nk;
const int maxn=1e7;
bool vis[maxn];
nk temp,temp2,temp3,temp4;
int main()
{
int n,k;
scanf("%d %d",&n,&k);
memset(vis,false,sizeof(vis));
if(k<=n)
{
printf("%d\n",n-k);
return 0;
}
nk start;
start.time=0;
start.x=n;
queue<nk>p;
while(!p.empty())
{
p.pop();
}
p.push(start);
while(!p.empty())
{
temp=p.front();
p.pop();
if(temp.x==k)
{
printf("%d\n",temp.time);
return 0;
}
if(temp.x<k&&!vis[2*temp.x])
{
vis[2*temp.x]=true;
temp4.x=2*temp.x;
temp4.time=temp.time+1;
p.push(temp4);
}
if(temp.x<k&&!vis[temp.x+1])
{
vis[temp.x+1]=true;
temp2.x=temp.x+1;
temp2.time=temp.time+1;
p.push(temp2);
}
if(temp.x>=1&&!vis[temp.x-1])
{
vis[temp.x-1]=true;
temp3.x=temp.x-1;
temp3.time=temp.time+1;
p.push(temp3);
}
}
return 0;
}
关于BFS的再次小练习,我认识到饿了在bfs的解题代码当中要注意排重和剪枝条件方面要弄的正确,这就是这种算法的一点点需要考虑的地方。
POJ 3278
最新推荐文章于 2021-07-26 18:06:13 发布