【一维最短路模型】 抓住那头牛

传送门

题意

给定起点\(n\),终点\(k\),每一步可以从\(x\)移动到\(x+1、x-1,2\cdot x\),步数都是\(1\),从起点到终点的最小步数是多少

数据范围

\(1\leq n,k\leq 10^{5}\)

题解

  • \(bfs\)在值域上搜索即可

  • 同样记录\(dist\),判重和记录移动的距离

Code

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<=n;i++)

const int N=1e5+10;
int n,k;
int dist[N];
void bfs(int x)
{
   queue<int>q;
   q.push(x);
   while(q.size())
   {
      int t=q.front();
      q.pop();
      rep(i,t-1,t+1)
      {
         int to=i;
         if(i==t) to*=2;

         if(to<0 || to >N) continue;
         if(dist[to]) continue;
         dist[to]=dist[t]+1;
         if(to==k) return;

         q.push(to);
      }
   }
}
int main()
{
   scanf("%d%d",&n,&k);
   bfs(n);
   printf("%d\n",dist[k]);
}
posted @ 2020-10-31 11:04  Hyx'  阅读(80)  评论(0)    收藏  举报