在一个数轴上,起点为n,终点为k
求从n走到k的最少步数
移动的方式有两种:
(1)从x移动到x-1或者x+1;
(2)从x移动到x*2。
其中0 <= n,k <= 2e5
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
const int N = 2e5 + 10;
int n,k;
bool vis[N];
queue<int> a,s;
void search(int na,int ns)
{
if(!vis[na])
{
a.push(na),s.push(ns);
vis[na] = true;
}
}
int bfs()
{
a.push(n),s.push(0);
vis[n] = true;
while(a.size())
{
int ha = a.front(),hs = s.front();
if(ha == k)
return hs;
if(ha - 1 >= 0)
search(ha - 1,hs + 1);
if(ha + 1 < N)
search(ha + 1,hs + 1);
if(ha * 2 < N)
search(ha * 2,hs + 1);
a.pop(),s.pop();
}
}
int main()
{
cin >> n >> k;
cout << bfs();
return 0;
}
这思路挺清晰的
hh主要还是简单啊,思路自然是非常清晰~