莫欺少年穷,修魔之旅在这开始—>算法提高课题解
思路:
1. 农名所走的点的范围:[0, N)
2. 找到起点放入队列,并更新起点步数
3. 三种操作:t + 1,t - 1,t * 2;
4. 符合范围且该点未走过,则放入队列并更新步数
5. 到达终点 k,则返回步数
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int n,k;
int dist[N];
int bfs()
{
//把起点放入队列,然后bfs
queue<int> q;
q.push(n);
//初始化dist数组,并更新起点步数
memset(dist,-1,sizeof dist);
dist[n]=0;
while(q.size())
{
//取出队头
auto t=q.front();
q.pop();
//到达终点,返回步数
if(t==k) return dist[k];
//执行 t + 1,符合条件且该点未走过,则放入队列并更新步数
if(t+1<N&&dist[t+1]==-1)
{
q.push(t+1);
dist[t+1]=dist[t]+1;
}
//执行 t - 1,符合条件且该点未走过,则放入队列并更新步数
if(t-1>=0&&dist[t-1]==-1)
{
q.push(t-1);
dist[t-1]=dist[t]+1;
}
//执行 t * 2,符合条件且该点未走过,则放入队列并更新步数
if(t*2<N&&dist[t*2]==-1)
{
q.push(t*2);
dist[t*2]=dist[t]+1;
}
}
return -1;
}
int main()
{
cin>>n>>k;
cout<<bfs()<<endl;
return 0;
}