哎,今天一看以前写的,真是不忍直视~担心以前被我毒害到的青年,我自己现在都被自己毒到了~~,于是先简单重写一波,晚上查查看有没有什么更加优化的地方,现在先还一波债;
用的是BFS,代码里有简单的优化:用isVisited来记录已经访问过的点,以及当前位置大于牛的位置的话,只剩下-1的方案能选。我数组开的挺大的,基本上是两倍的,是为了防止K接近100000的时候,内存爆了。直接用了两个queue,也可以用pair简化一点代码~
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=2*1e5+5;
bool isVisited[maxn];
int N,K;
int bfs()
{
if(K<=N)
return N-K;
int t;
queue<int> q,times;
q.push(N);
times.push(0);
isVisited[N]=true;
while(!q.empty())
{
int fa=q.front();
t=times.front();
t++;
q.pop();
times.pop();
if(fa*2==K||fa+1==K||fa-1==K)
break;
else{
if(fa<K){
if(fa*2<maxn&&!isVisited[fa*2])
{
q.push(fa*2);
times.push(t);
isVisited[fa*2]=true;
}
if(fa+1<maxn&&!isVisited[fa+1])
{
q.push(fa+1);
times.push(t);
isVisited[fa+1]=true;
}
}
if(fa-1>=0&&!isVisited[fa-1])
{
q.push(fa-1);
times.push(t);
isVisited[fa-1]=true;
}
}
}
return t;
}
int main()
{
while(~scanf("%d%d",&N,&K))
{
memset(isVisited,false,sizeof(isVisited));
printf("%d\n",bfs());
}
return 0;
}