这道题基本上就是骑士移动(poj 1915)的一个一维的变形,值得借鉴的是方向数组的定义方法,因为这题有三种移动情况:移动到当前位置加一,减一,或者当前位置的二倍的位置。所有请看代码里的方向数组的定义方法,很巧妙。其它没什么了,也是求最少步数,当广搜到终点的时候就返回。
#include<iostream>
using namespace std;
int dir[3][2]={{1,1},{1,-1},{2,0}};//方向数组
int N,K,a[1000000],vis[1000000],step[1000000];
//起点 终点 队列数组 标记数组 步数 //数组开小了悲剧了 两天 我日!!!
void bfs(int i)
{
int front,rear,x,k;
front=0;rear=0;
a[rear++]=i;
vis[i]=1;
step[i]=0;
while(front<rear)
{
i=a[front++];
for(k=0;k<3;k++)
{
x=i*dir[k][0]+dir[k][1];
if(!vis[x]&&x>=0&&x<=100000)
{
if(x==K)
{
step[x]=step[i]+1;
return;
}
else
{
vis[x]=1;
a[rear++]=x;
step[x]=step[i]+1;
}
}
}
}
}
int main()
{
cin>>N>>K;
memset(vis,0,sizeof(vis));
memset(step,0,sizeof(step));
memset(a,0,sizeof(a));
bfs(N);
printf("%d",step[K]);
//system("pause");
}