#include<stdio.h>
#include<iostream>
#include<string.h>
#include<queue>
using namespace std;
int N, K;
const int MAXN = 100000;
int visited[MAXN + 10];
struct Step
{
int x;
int steps;
Step(int xx, int s):x(xx),steps(s){}
};
queue<Step>q;
int main()
{
cin >> N >> K;
memset(visited, 0, sizeof(visited));
q.push(Step(N, 0));
visited[N] = 1;
while(!q.empty())
{
Step s = q.front();
if( s.x == K )
{
cout << s.steps << endl;
return 0;
}
else///从当前可以扩展的节点统统地扩展,并对扩展过的节点标记,不重复扩展,广度优先搜索一般适用于从父节点到子节点比较明确的情况,
{ ///同一层的节点正常情况相同对待就可以了,不仅适用于图类问题,用的比较广泛
if( s.x-1 >= 0 && !visited[s.x-1] )
{
q.push(Step(s.x-1, s.steps+1));
visited[s.x-1] = 1;
}
if( s.x+1 <= MAXN && !visited[s.x+1])
{
q.push(Step(s.x+1, s.steps+1));
visited[s.x+1] = 1;
}
if( s.x*2 <= MAXN && !visited[s.x*2] )
{
q.push(Step(s.x*2, s.steps+1));
visited[s.x*2] = 1;
}
q.pop();
}
}
return 0;
}
广搜的学习
最新推荐文章于 2021-08-22 09:50:43 发布