哎,今天一看以前寫的,真是不忍直視~擔心以前被我毒害到的青年,我自己現在都被自己毒到了~~,於是先簡單重寫一波,晚上查查看有沒有什麼更加優化的地方,現在先還一波債;
用的是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;
}