http://poj.org/problem?id=3278
大意是说牛在原地不动,他在某点去抓牛,他有两种方式可以走,第一种走一步,往前往后都可,第二种是走现在所在点的两倍的数目。只要能够刚好到达牛所在的那个点就行了。
因为题目中给了提示用广搜BFS,在三个方向上广搜就可以,这个题是借鉴了某位大神的才写出来的http://blog.csdn.net/ffq5050139/article/details/7341377。
#include<cstdio>
#include<cstring>
#include<queue>
#include<iostream>
const int MAXN=;
using namespace std;
int vis[MAXN];
int step[MAXN];
queue<int>q;
int bfs(int n,int k)
{
int head,next;
q.push(n);
vis[n]=;
step[n]=;
while(!q.empty())
{
head=q.front();
q.pop();
for(int i=;i<=;i++)
{
if(i==) next=head-;
else if(i==) next=head+;
else if(i==) next=head*;
if(next>MAXN||next<)//边界
continue;
if(!vis[next])//重点,走过的可以不用加进去了
{
q.push(next);
step[next]=step[head]+;
vis[next]=;
}
if(next == k)
return step[next];
}
}
}
int main()
{
int n,k;
scanf("%d %d",&n,&k);
if(n>=k)
printf("%d\n",n-k);
else
{
printf("%d\n",bfs(n,k));
}
return ;
}