这个题是一个容易理解题意的简单BFS题目.....作为菜鸟的我竟然能自己想到解决方案...不容易...
个人思路如下,
农夫在每个点都有三种走法,我们先把初始位置标记为走过,三种方法位置没走过就入队,开始三个点都能入队,再对三个点每次出队一个,
分析这个点的三个位置能否走,能走得入队,...依此类推.....
这里我用的访问数组是乘以个系数再加上一个数...for循环判断..
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
int N,K;
int flag[2000001];//这里开到两百万,为什么我也不清楚,开始一直RE后面这个就过啦?有知道的可以指教一下....
struct point
{
int x,step;
}t,p;
int arr[3][2]={1,1,1,-1,2,0};//这里指定义访问方向,就是向前和向后,还有一个乘以2的
void bfs()
{
queue<point>q;
t.x=N;
t.step=0;
q.push(t);
flag[N]=1;
while(!q.empty())
{
t=q.front();
q.pop();
if(t.x == K)
{
printf("%d\n",t.step );
return;
}
for(int i=0;i<3;i++)
{
p=t;
p.step++;
p.x=t.x*arr[i][0]+arr[i][1];
if(p.x>=0 && !flag[p.x] && p.x<200000)//20万
{
flag[p.x]=1;
q.push(p);
}
}
}
}
int main()
{
while(scanf("%d%d",&N,&K)!=EOF)
{
memset(flag,0,sizeof(flag));
if(N>K)// 我试了一下这个判断有无对程序影响不大...
printf("%d\n",N-K);
else
bfs();
}
return 0;
}