题目链接:http://poj.org/problem?id=3278
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
struct node
{
int s;//当前位置
int t;//最短时间
};
node S,T;
node New,Now;
queue<node> Q;
int N,K;
const int MAX=200000;
bool vis[MAX];
int bfs()
{
memset(vis,false,sizeof(vis));
Q.push(S);
vis[S.s]=true;
while(!Q.empty())
{
Now = Q.front();
Q.pop();
for(int i=0;i<3;i++)
{
if(i==0)
{
New.s = Now.s+1;
}
else if(i==1)
{
New.s = Now.s-1;
}
else
{
New.s = Now.s*2;
}
New.t = Now.t+1;
if(New.s<0||New.s>MAX||vis[New.s])
continue;
vis[New.s] = true;
Q.push(New);
if(New.s == T.s)
return New.t;
}
}
return 0;
}
int main()
{
while(cin>>N>>K)
{
S.s=N;
T.s=K;
S.t=0;
while(!Q.empty())
Q.pop();
if(N>=K)
cout << N-K << endl;
else
{
int ans=bfs();
if(ans>0)
cout<<ans<<endl;
}
}
return 0;
}
本道题是典型的BFS,在处理入队的限制的条件,运用了FOR循环,但这也就需要注意接下来的步骤需要在循环里面进行,否则就会造成死循环,无法输出答案,而且本道题数组需要开的大点,同时也要注意返回值。